簡體   English   中英

Node.JS async.parallel不會等到所有任務都完成

[英]Node.JS async.parallel doesn't wait until all the tasks have completed

我使用aync.parallel並行運行兩個函數。 這些函數請求RSS提要。 然后解析RSS提要並將其添加到我的網頁。

但由於某種原因, async.parallel運行回調方法而不等待兩個函數完成

文件說:

任務完成后,結果將作為數組傳遞給最終回調。

我的代碼。

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文檔說:

必須在每個響應上調用方法response.end()。

如果我不打電話,我的網頁將被“下載”(我的意思是我的瀏覽器地址欄中的進度條)。

我想你的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() ,以便Node知道消息已完成並且已寫入所有內容(標題+正文)。 否則,套接字將保持打開狀態並將永遠等待另一條消息(這就是瀏覽器顯示進度條的原因:它不知道請求已經結束)。

您可以使用async.reflectasync.reflectAll來確保所有函數都已完成http://caolan.github.io/async/docs.html#reflect

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM