概數
async-lock的npm地址
https://www.npmjs.com/package...
爲什麼是async-lock?
因爲我見其下載量比較大(在我發現的所有類似庫中是最大的)且最近更新時間較近。
場景
- 在異步函數中,由於存在異步操作,對此函數的A,B兩次執行會出現結束次序不可控。即A先執行,卻比B後退出函數。
- 對於數據庫的操作,有時會將select的值進行一系列業務變化後重新update至數據庫。就比如簡單的計數器,0開始計數,假設由於業務原因,
必須在代碼中進行+1操作。則A讀取數據庫進入異步執行,此時B也開始執行讀取數據庫的代碼,最終後造成兩次執行後計數器只加了1。
此時便需要鎖機制,類似於Java中的synchronized
或者lock
。執行同一段代碼時,添加相同的key,則發現此key正在使用,則直接放入此key的待執行數組。
async-lock原理
AsyncLock類:
- queues:用於存儲所有的待執行函數,格式爲:{key: [function, function]}
-
acquire(key, fn):
- key:需要上鎖的名稱,即queues中的key
- fn:爲需要執行的函數。操作即將fn添加到queues[key]對應的數組中。若queues無此key字段,則將起值置[]後直接執行。
當key對應函數執行完畢後,會檢查queues中對應key值數組是否爲空,爲空則執行delete queues[key],否則繼續執行下一個待執行函數。
其餘使用細節就 略。