node js async - 阻止立即执行主回调

时间:2016-05-13 15:06:08

标签: node.js asynchronous

我使用节点js异步模块,我想运行一堆并行函数。如果其中一个函数返回错误,我不希望立即执行主回调。我希望在任何情况下最后执行主回调,并且我想获得一个返回错误的项目数组,以及一系列正常的项目。没有额外的逻辑,这一切都可能吗?

2 个答案:

答案 0 :(得分:0)

尝试查看Javascript Promise对象。

让所有并行函数返回一个promise对象,将它们全部放入一个数组中。 然后,做Promise.all([promises])。然后(回调); 除非你的函数抛出异常,否则你可以保证只有在执行所有函数后才调用回调。

答案 1 :(得分:0)

不是在该函数的回调中返回错误,只需将错误推送到错误数组,将ok项推送到ok数组,并使用null作为所有函数的第一个参数(callback(null))调用回调。像这样:

var okArray = [];
var errorArray = [];

async.parallel([
    function(callback) {
        // do something
        if (error) {
            errorArray.push(errorItem);
        } else {
            okArray.push(okItem);
        }
        callback(null);
    },
    function(callback) {
        // do something
        if (error) {
            errorArray.push(errorItem);
        } else {
            okArray.push(okItem);
        }
        callback(null);
    }
], function(err) {
    console.log(okArray);
    console.log(errorArray);
});

如果您不介意并行调用中的成功/失败函数只有1个数组,则parallel会按照数组中列出的顺序为每个函数返回一个结果数组。例如:

async.parallel([
    function(callback) {
        // do something
        if (error) {
            return callback(null, errorItem);
        }
        callback(null, okItem);
    },
    function(callback) {
        // do something
        if (error) {
            return callback(null, errorItem);
        }
        callback(null, okItem);
    }
], function(err, results) {
    console.log(results); // results[0] = what 1st function returns
                          // results[1] = what 2nd function returns
});