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

问题描述 投票:0回答:3

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

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

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


0
投票

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


0
投票

请确保您使用的API路径不应该有任何返回..我在像这样调用API后解决了这个问题... 请不要,我在当地工作时遇到了这个问题


fetchLearnMoreProxy: (isoCode, langCode) =>
    `http://localhost:3001/api?url=${hostName}/api/abc/cde?country=${isoCode}&language=${langCode}`,

如有任何问题请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.