5

我正在使用aync.parallel並行運行兩個函數。這些功能請求RSS提要。然後解析RSS提要並添加到我的網頁中。Node.JS async.parallel不會等到所有任務完成

但由於某些原因async.parallel運行回調方法,而無需等待,直到兩個功能已經完成

The documentation says:

一旦任務完成,結果被傳遞到最終 回調作爲一個數組。

我的代碼。

require('async').parallel([ function(callback) { 
     fetchRss(res, bbcOpts); // Needs time to request and parse 
     callback(); 
    }, function(callback) { 
     // Very fast. 
     callback(); 
    } ], function done(err, results) { 
     if (err) { 
      throw err; 
     } 
     res.end("Done!"); 
    }); 

其實我只有「完成!」在我的網頁上。爲什麼?

爲什麼我需要撥打res.end()

Node.JS documentation說:

的方法,到Response.End(),必須對每個響應調用。

如果我不叫它,我的網頁將被「下載」(我的意思是我的瀏覽器的地址欄中有一個進度條)。

回答

9

我想你的fetchRss函數是異步的:稍後執行,並立即調用回調函數。你應該回調發送到fetchRss

function fetchRss(res, bbcOpts, callback) { 
    doSomething(); 
    callback(); 
} 

require('async').parallel([ function(callback) { 
     fetchRss(res, bbcOpts, callback); // Needs time to request and parse 
    }, function(callback) { 
     // Very fast. 
     callback(); 
    } ], function done(err, results) { 
     if (err) { 
      throw err; 
     } 
     res.end("Done!"); 
    }); 

在一個側面說明,你應該叫res.end()爲了節點知道的信息是完整而這一切(頭+體)已被寫入。否則,套接字將保持打開狀態並將永遠等待另一條消息(這就是瀏覽器顯示進度條的原因:它不知道請求已結束)。