2013-05-16 134 views
0

我有調用兩個異步函數的函數。主要功能處理來自用戶的請求。這裏是例子:如何在node.js中的一個步驟中執行兩個異步操作作爲一個原子操作?

mainFunction(req, res, done) { 
    asyncExist(req, function(exists) { 
     if (!exists) { 
      asyncCreate(req, done); 
     } 
    }) 
} 

問題是當我有很多請求。我的主要功能是調用異步。在調用函數asyncCreate之前,Nodejs爲許多請求執行函數asyncExist。結果asyncCreate函數被多次調用相同的參數。問題是如何處理這個基本問題?

+0

我沒有看到這個問題。函數總是會用正確的參數調用一次。 – TheHippo

+0

請注意我正在談論多重請求。 – hsd

+0

node.js是單線程的,所以數據不會混淆。每次處理一個請求,每當發生回調或「回來」時都切換上下文。 – TheHippo

回答

0

您需要鎖定機制。我不確定你正在使用什麼數據存儲,但你需要弄清楚它提供了什麼樣的鎖定或事務原語。

數據存儲區上的鎖定允許您允許第一個請求在第一個請求完成之前讓後續請求等待,然後再以asyncExist開始。

我已經使用了lock pattern for redis看起來是這樣的:如果你使用其他數據存儲

mainFunction(req, res, done) { 
    asyncGetLock(function(releaseLock) { 
    asyncExist(req, function(exists) { 
     if(exists) { 
     releaseLock(); 
     return; 
     } 
     asyncCreate(req, done, function() { 
     releaseLock(); 
     }); 
    }); 
    }); 
} 

類似概念也適用。例如,在SQL中它將被稱爲事務。你的第一個要求是begin transaction,那麼你會做你的測試和你的條件更新,然後你會commitrollback作爲最後一步。

+0

這可以解決我的問題。我正在使用mongodb。問題如何使用鎖定這個數據庫? – hsd