6

我正在使用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()。

如果我不调用它,我的网页将被“下载”(我的意思是浏览器地址行中的进度条)。

4

2 回答 2

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

于 2013-11-25T07:28:57.940 回答
0

您可以使用async.reflectasync.reflectAll来确保所有功能都已完成 http://caolan.github.io/async/docs.html#reflect

于 2017-06-06T16:28:53.723 回答