2016-05-27 4 views
0

ich async.mapLimit bin mit ein paar Gleichzeitigkeit Verfahren auf einem Array mit Grenze von 10 zu machen:den Parameterfehler Verwendung zu fehlgeschlagenen Prozess des in async.mapLimit trennen

async.mapLimit(files, 10, function(file, callback) { 

    ... etc... 

}, function(error, files) { 

    ... etc.. 
}); 

Im Inneren der Hauptfunktion, ich bin einen Asynchron-Betrieb mit child_process ausgeführt wird, und wenn alles geschehen, wie es sollte, ich nenne nur den Rückruf:

callback(null, files); 

Aber ... wenn etwas Schlimmes passiert, muss ich auch den Rückruf rufen sie die Datei vorbei, weil ich don Ich will alles beenden, ich ordne nur die Datei mit einer Fehlereigenschaft zu und rufe den Callb auf ack:

file.error = error; 
callback(null, file); 

Also, wenn der zweite async.mapLimit Rückruf ausgelöst wird, habe ich eine Reihe von Dateien:

, function(error, files) { 

    console.log(files); 
}); 

Ausgang:

[ 
    { 
    name: 'file_2', 
    error: 'something'... 
    }, 
    { 
    name: 'file_1', 
    ...etc 
    } 
] 

die Also brauchen, ich trennen Dateien, die fehlgeschlagen ist, zu tun:

var failedFiles = []; 
var okFiles = []; 

files.forEach(function(file) { 
    if (file.error) 
    failedFiles.push(file); 
    else 
    okFiles.push(file; 
}); 

I w möchte wissen, ob es nicht möglich ist, die Dateien zurückzugeben, die als Array fehlgeschlagen sind, und dann auf den Parameterfehler des zweiten async.mapLimit-Callbacks zugreifen kann.

Vielen Dank im Voraus :).

Antwort

0

async.mapLimit() stoppt sofort, wenn eine Iteration einen Fehler "zurückgibt", also ist es nicht möglich, das zu tun, was Sie wollen.

Als Alternative anstelle async.mapLimit() verwenden könnten Sie async.eachLimit() verwenden und drücken Sie die Datei Objekte in das jeweilige Array innerhalb der Iterator-Funktion:

var failedFiles = []; 
var okFiles  = []; 

async.eachLimit(files, 10, function(file, callback) { 
    if (SOME_ERROR) { 
    failedFiles.push(file); 
    } else { 
    okFiles.push(file); 
    } 
    callback(); 
}, function(err) { 
    ... 
}); 
+0

Perfect! Ich benutzte dies mit Map-Limit und ich war mit diesem Gefühl "etwas stimmt nicht" .. hahaha –

Verwandte Themen