2011-05-21 36 views
5

有人可以指出或解釋某種基於事件的設計模式,它處理等待兩個事件以完成執行操作的情況。
我有一個加載異步的模板和一個同時發生的數據庫調用。我只有在這兩項任務都完成時才需要執行響應。
我能想出的唯一解決方案是做一些醜陋的事情,比如在布爾事件中設置爲true,然後檢查它們是否全部爲真。有一個更好的方法嗎?JS節點對事件的異步處理

+0

好像他們不應該是平行的異步事件,然後除非我失去了一些東西。我只是做事件1 - >事件1回調 - >事件2 - >事件2回調 - >數據庫插入 – 2011-05-21 20:46:51

+0

這是一個請求響應....解析模板 - >呈現頁面< - 查詢數據庫....我知道它有點微不足道,因爲解析總是更快,但這是一個學習問題。 – Prospero 2011-05-24 16:29:06

回答

3

有沒有簡單的方法來做到這一點,但有很多flow control libraries處理這種事情。最簡單的方法可能是保持一個全局計數器,當你開始一個異步調用時該計數器遞增,然後在完成時在回調中遞減。每個操作都可以在計數器完成時檢查計數器,如果計數器爲零,則會觸發依賴於兩者的響應。

+0

我喜歡對方的想法。很簡單。謝謝。 – Prospero 2011-05-22 08:43:04

8

我想補充一個例子無論是從克里斯的回答:

使用異步,https://github.com/caolan/async

async.parallel([ 
    function(callback){ 
     // query a database, lets say mongodb/mongoose 
     User.findOne({email: email}, function(err, user){ 
      callback(err, user); 
     }); 
    }, 
    function(callback){ 
     // Load a template from disk 
     fs.readFile('views/user.html', function (err, data) { 
      callback(err, data) 
     }); 
    } 
], function(err, results){ 
    // Should have [user, template data] 
}); 

或用計數器:

var user  = false, 
    template = false, 
    count = 2; 

function build_user_view(){ 
    // user, template should be available 
} 

User.findOne({email: email}, function(err, userDoc){ 
    user = userDoc; 
    --count || build_user_view(); 
}); 


fs.readFile('views/user.html', function (err, data) { 
    template = data; 
    --count || build_user_view(); 
}); 
+0

優秀的例子 - 謝謝 – 2011-05-27 12:50:58