Angenommen, ich habe ein Array und eine Funktion A:
var array = ['a', 'b', 'c'];
function A(p) { ... };
Jetzt möchte ich jedes Element von array
an die Funktion A
übergeben und möchte, dass sie in einer sequentiellen Reihenfolge ausgeführt werden. Normalerweise gibt es kein Problem. Ich kann:
array.forEach(function(item) {
A(item);
}
Wenn jedoch in A
eine asynchrone Aktion vorhanden ist, wird alles durcheinander gebracht. Die Frage ist also:
Wie kann ich sie ordnungsgemäß ausführen lassen, auch wenn in A asynchrone Aktionen vorhanden sind?
Damit meine ich, dass A ('b') ausgeführt werden soll, nachdem A ('a') vollständig beendet ist (einschließlich aller darin enthaltenen asynchronen Aktionen).
Ich denke, es muss schon einige Dienstprogramme gegeben haben, die solche Dinge tun. Kann mir jemand etwas Licht ins Dunkel bringen?
3 Antworten
Dies ist ein perfekter Anwendungsfall für "eachSeries" von async.js
Sie könnten es so verwenden
async.eachSeries(array, A, function(err) {
// this function gets called at the end
// after your array has been looped
});
Und Sie müssten Ihre A-Funktion mit einem zweiten Parameter ändern - einem Rückruf.
function A(p, callback) {
// ...
return callback();
}
Dadurch wird der Rückrufparameter aufgerufen, sobald Ihre asynchronen Aufrufe in A abgeschlossen sind.
Mit JavaScript Versprechen können Sie genau das tun.
Dieses Beispiel ist ziemlich kompliziert, zeigt jedoch einige Aspekte der Verwendung von Versprechen:
var arr = ['a', 'b', 'c'];
function processAsync(val) {
return new Promise(function(res, rej) {
console.log("Starting:", val);
setTimeout(function () {
console.log("Done:", val);
res();
}, 1000);
});
}
arr.reduce(function(promise, i) {
return promise.then(processAsync.bind(null, i));
}, Promise.resolve());
var array = ['a', 'b', 'c'],i = 0;
var A = function(p){
//some code
$.ajax({
success:function(){
try{
A(item[++i]);
}catch{
return;
}
}
});
}
Bist du gemein dazu?