async.series里面的async.parallel

时间:2015-06-11 02:56:00

标签: node.js asynchronous

我在aysnc.eachSeries调用中有这个async.parallel功能。 我硬编码错误,所以我可以通过它,看看它是否按照我的想法行事。出于某种原因,当我传递错误时,它不会被抛出在名为" doneWithSeries"的最终回调中。

async.eachSeries(jsonDataArr, function iterator(item, callback) {

    async.parallel([
            function (cb) {
                if (item.hasOwnProperty('event.type')) {

                    var event_type = item['event.type'];
                    delete item['event.type'];
                    try {
                        var json = JSON.stringify(item);
                    }
                    catch (err) {
                        throw err;
                    }
                    fs.writeFile('./enriched_data/' + event_type + '.json', json, function (err) {
                        if (err) {
                            cb(err);
                        }
                        else {
                            cb(null);
                        }
                    });
                }
            },
            function (cb) {
                if (item.hasOwnProperty('status_desc')) {

                    var status_desc = item['status_desc'];
                    delete item['status_desc'];
                    try {
                        var json = JSON.stringify(item);
                    }
                    catch (err) {
                        throw err;
                    }
                    fs.writeFile('./enriched_data/' + status_desc + '.json', json, function (err) {
                        if (err) {
                            cb(err);
                        }
                        else {
                            cb(null);
                        }
                    });
                }
            }
        ],

        function doneWithParallel(err) {
            callback(new Error('throw this baby')); //shouldn't the first incident of error pass the error straight to the doneWithSeries callback below?
        })
},
function doneWithSeries(err) {

    if (err) {
        throw err;
    }
    else {
     console.log('success');
    }
});

这是代码的简化版本,没有任何必要:

var async = require('async');

async.eachSeries(['1', '2'], function (item, callback) {

        async.parallel([
                function (cb) {
                    setTimeout(function () {
                        cb(null, 'one');
                    }, 200);
                },
                function (cb) {
                    setTimeout(function () {
                        cb(null, 'two');
                    }, 100);
                }
            ],
            function doneWithParallel(err, results) {
                console.log('results', results);

                callback(new Error('duh'));
            })
    },
    function doneWithSeries(err) {

        if (err)
            throw err;
    });
确实有效。无法弄清楚为什么我上面的代码没有,也许接受这个数组可能是空的,即使我运行我的代码时成功消息也被记录了......很奇怪。

1 个答案:

答案 0 :(得分:2)

如果您的列表为空,我认为这是预期的行为。即使没有输入列表,async也总是会调用最终的回调函数。