Node.JS async.parallel不会等到所有任务完成
我正在使用aync.parallel并行运行两个函数。 这些函数请求RSS提要。 然后RSS提要被parsing并添加到我的网页。
但由于某种原因, async.parallel
运行callback方法,而不必等到两个函数完成
该文件说:
一旦任务完成,结果作为一个数组传递给最终的callback。
我的代码。
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
函数是asynchronous的:稍后执行,并立即调用callback。 您应该将callback发送到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.reflect或async.reflectAll来确保所有function都已完成http://caolan.github.io/async/docs.html#reflect