节点异步模块:并行重试

时间:2017-03-12 09:04:07

标签: node.js asynchronous async.js node-async

以下是使用async.parallel的简单示例:

var fakeTimer = 0;
async.parallel({
    one: function(callback) {
        if (fakeTimer < 2) {
            callback(new Error('too soon!'), null);
            fakeTimer++;
        } else {
            callback(null, 'I am one');
        }
    },
    two: function(callback) {
        callback(null, 'I am two');
    }
}, function(err, results) {
    if (err) {
        console.log('failed!');
    } else {
        console.log(results);
    }
});

当它运行时,它当然总是以失败告终。我要做的是继续重试,直到fakeTimer变得足够大,one功能成功。

因此可以重试整个async.parallel,例如5次,或仅one功能。我知道有async.retry功能,但我无法理解如何将其与async.parallel结合起来以达到我想要的效果。

我认为理想情况下应该重试整个async.parallel,以便在任何并行分支中发生错误时它都能正常工作,但是看到整体重试和每个分支的示例会很棒重试。

1 个答案:

答案 0 :(得分:0)

以下似乎有效:

var fakeTimer = 0;

var parallelFunctions = {
    one: function(callback) {
        if (fakeTimer < 2) {
            callback(new Error('too soon!'), null);
            fakeTimer++;
        } else {
            callback(null, 'I am one');
        }
    },
    two: function(callback) {
        callback(null, 'I am two');
    }
};

var doThemInParallel = function(callback) {
    async.parallel(parallelFunctions, function(err, results) {
        callback(err, results);
    });
};

var retries = 2; // must be > 2 to succeed
async.retry(retries, doThemInParallel, function(err, results) {
    console.log(err, results);
});