2017-12-03 208 views
0

我有一個REST API,它會一個接一個地執行一系列異步任務。代碼如下所示:在Node.js中鎖定承諾鏈接

asyncFunc1() 
.then(asyncFunc2()) 
.then(asyncFunc3()) 
.then(asyncFunc4()) 

第一步將執行一些數據庫查詢,最後一步將更新數據庫。當然(因爲我來自java/c + +背景),我會在我的承諾鏈的開頭添加一個鎖,以確保與數據庫的交互受到保護。

但我是新來的Node.js和它的異步處理單線程模式困惑我在這裏。因此,我應該在每個涉及數據庫操作的步驟中添加一個鎖,在我的承諾鏈的開頭鏈接或添加鎖,或者我根本不需要鎖?

-------- ---------更新

正如一位評論和答覆指出了這一點,我寫我的錯鏈(我的實際代碼是正確的,雖然,只是一個簽署表明我是新來的Node.js:$)

asyncFunc1() 
    .then(asyncFunc2) 
    .then(asyncFunc3) 
    .then(asyncFunc4) 

其實我在我的鏈的開頭使用Redlock,我不知道這是一個好主意。拉胡爾辛格提供的答案表明我不需要鎖定!

+0

什麼抵抗鎖定後衛? – stone

+0

首先,你的連鎖店是錯誤的。它應該是'asyncFunc1()。then(asyncFunc2).then(asyncFunc3)'等等...傳遞函數引用 - 不要先調用它們並傳遞返回結果。 – jfriend00

+0

具有故意排序的命令的單線程模式不應該針對該代碼序列進行數據庫鎖定。但是,如果有其他請求可能同時運行,那麼如何處理數據庫更新以避免併發問題完全取決於您的代碼正在執行的操作以及數據庫的工作方式。對於鎖沒有通用要求,但是對於數據庫來說,讀取某些內容,修改內容並將其寫回等操作可能需要以某種方式受到來自其他請求的競爭條件的保護,這些請求也使用數據庫。 – jfriend00

回答

0

當您使用新的承諾承諾()被調用,因此所有 你的函數爲您創建它們,而不是當你 連鎖它們實際上被執行。

您鏈功能應該像

asyncFunc1().then(asyncFunc2).then()... 

的asyncFunc1應該是返回一個承諾,而不是一個承諾本身的功能。

諾蘭勞森就以承諾一臉這article更多

+0

是的,我在這裏寫錯了(作爲一個標誌,我是新的node.js:$我的實際代碼是正確的,正如你所說) – Qiulang

+0

@Qiulang總之,你不需要鎖,然後在承諾將處理。 –

+0

作爲我從@ jfriend00得到的另一個評論,我的代碼完全「讀取某些內容,修改它並將其寫回」。我假設我的REST API可能會在同一時間被調用,所以我添加了一個鎖。 – Qiulang