Gibt es einen Sinn, dies mit anderen Lösungen eleganter zu machen (jquery ist in Ordnung)?Erzeugt aus sequentiellen Array-Ausführungen mit Deferred (jquery)
Wichtig in meinem Fall ist, dass entsprechende Ausführungen nur ausgelöst werden, wenn die vorherigen beendet wurden.
seqExe(["item one", "item two", "item three", "item four", "item five"])
function seqExe(corpus) {
var i = -1,
len = corpus.length,
defer = jQuery.Deferred(),
promise = defer.promise();
while(++i < len) {
promise = promise.then((function(item) {
return function() {
console.log(item);
return foo(item);
}
}).call(this, corpus[i]));
}
promise.then(function() {
console.log("Done");
}, function() {
console.error("Failed");
});
return defer.resolve();
}
function foo(item) {
var defer = jQuery.Deferred();
window.setTimeout(
function() {
defer.resolve()
console.log(item);
}, Math.random() * 2000 + 1000);
return defer.promise();
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
sollte Vermeintliche ausgegeben werden:
item one
item one
item two
item two
item three
item three
item four
item four
item five
item five
Done
Was meinen Sie mit „* dann werden Rückrufe synchron ausgeführt, die die falsche Ausgabereihenfolge geben würde * "? Das kann nur bei bereits erfüllten Versprechen passieren, d. H. '$ .when()', aber alles nach dem ersten 'foo()' Aufruf ist verkettet. – Bergi
@Bergi, ich meinte, wenn ich in den Snippet, den ich gepostet habe, habe ich mit jQuery Version 2.1.1 statt 3.1.1 verbunden, änderte sich die Reihenfolge der Ausgabe. NB: Ich habe jetzt eine Korrektur vorgenommen, weil ich zuerst das zweite console.log verschoben und vergessen habe, es wieder einzusetzen (nach der Auflösung). – trincot
Ah, das. Richtig, du müsstest den 'console.debug' vor dem' deferred.resolve() 'Aufruf dafür platzieren. – Bergi