2017-03-12 2 views
0

Hier ist ein einfaches Beispiel für die Verwendung von async.parallel:Knoten Asynchron-Modul: Kombinieren Sie parallel mit Wiederholungs

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); 
    } 
}); 

Wenn diese läuft, natürlich ist es endet immer mit einem Mißerfolg. Was ich gerne tun würde, ist so lange zu versuchen, bis fakeTimer groß genug geworden ist, dass die one Funktion erfolgreich ist.

So könnte entweder das ganze async.parallel versucht werden, z.B. 5 mal, oder nur die one Funktion. Ich weiß, dass es die async.retry Funktion gibt, aber ich kann einfach nicht meinen Kopf bekommen, wie man das mit async.parallel kombiniert, um zu erreichen, was ich will.

Ich denke, idealerweise sollte das ganze async.parallel versucht werden, so dass es funktioniert, wenn der Fehler in einer der parallelen Zweige auftritt, aber es wäre toll, ein Beispiel für eine allgemeine Wiederholung und eine Wiederholung pro Zweig zu sehen.

Antwort

0

Die folgende scheint zu funktionieren:

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); 
});