繁体   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