Node.js parallel不会等到所有任务都完成后才执行

g2ieeal7  于 12个月前  发布在  Node.js
关注(0)|答案(2)|浏览(117)

我使用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文档说:
方法response.end()必须在每个响应中调用。
如果我不调用它,我的网页将被“下载”(我的意思是在我的浏览器地址行的进度条)。

pgccezyw

pgccezyw1#

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

68bkxrlz

68bkxrlz2#

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

相关问题