Node.JS async.parallel不会等到所有任务都完成

时间:2013-11-25 07:22:21

标签: javascript node.js parallel-processing progress-bar node-async

我正在使用aync.parallel并行运行两个函数。这些函数请求RSS提要。然后解析RSS提要并将其添加到我的网页。

但由于某种原因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()。

如果我不打电话,我的网页将被“下载”(我的意思是浏览器地址栏中的进度条)。

2 个答案:

答案 0 :(得分:10)

我认为你的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知道消息已完成并且所有内容(标题+正文)都已写入。否则,套接字将保持打开状态并将永远等待另一条消息(这就是浏览器显示进度条的原因:它不知道请求已经结束)。

答案 1 :(得分:0)

You can use async.reflect or async.reflectAll to do make sure all functions are completed http://caolan.github.io/async/docs.html#reflect