2017-06-27 116 views
1

Pusedo代碼:的NodeJS - 等待回調結束

app.get('/', (req, res) => { 
    request(url, callback1) //callback1 alters 'index' template a bit 
    request(url, callback2) //callback2 alters 'index' template a bit 
    request(url, callback3) //callback3 alters 'index' template a bit 

    res.render('index'); //Have to render after callback1,2,3 are done 
}); 

如何確保render畢竟回調都解決了只叫什麼名字?

PS。每個呼叫的URL都不相同。

回答

2

您可以維護所有的異步調用一個計數器和渲染資源,如果計數器等於異步調用的數量。

下面是相同的代碼片段:

app.get('/', (req, res) => { 
    var count = 0; 
    request(url1, function(err, data) { 
     count++; 
     // something to be done 
     if(count == 3) { 
      res.render('index'); 
     } 
    }); 
    request(url2, function(err, data) { 
     count++; 
     // something to be done 
     if(count == 3) { 
      res.render('index'); 
     } 
    }); 
    request(url3, function(err, data) { 
     count++; 
     // something to be done 
     if(count == 3) { 
      res.render('index'); 
     } 
    }); 

您可以使用循環上的網址,而不是寫不同的請求塊,如果做任務是在每次回調相同。

3

您可以使用request-promise

app.get('/', (req, res) => { 
    request(url) 
    .then(callback1) 
    .then(() => request(url)) 
    .then(callback2) 
    .then(() => request(url)) 
    .then(callback3) 
    .then(() => res.render('index')); 
}); 
+0

請參閱編輯的答案,使用request-promise –

+0

剛剛做了一個新版本,以防止回調返回承諾 –

-1

節點承諾模塊將有所幫助。 通過使用該模塊,可以在執行完所有回調後發送響應。

+0

請[只避免鏈接只回答](http://meta.stackoverflow.com/tags/link-only-answers /信息)。答案是「幾乎不超過鏈接到外部網站」[可能會被刪除](http://stackoverflow.com/help/deleted-answers) – Quentin

+0

好吧,我現在將它刪除 – joedavis