Sie können nicht eine synchrone for
-Schleife mit asynchronen Operationen kombinieren und Dinge richtig Reihenfolge, weil es keine Möglichkeit gibt, eine for
Schleife "warten" auf ein Versprechen zu beenden. Die for
-Schleife wird synchron ausgeführt, sodass alle asynchronen Vorgänge gleichzeitig gestartet werden.
Also, stattdessen müssen Sie Ihre Iterationen anders machen. Wenn Sie nur einen Parameter iterieren würden, gäbe es eine Reihe vorgefertigter Möglichkeiten, dies zu tun, aber mir sind keine vorgefertigten Lösungen bekannt, um drei verschachtelte Variablen zu iterieren, so dass Sie Ihre eigenen erstellen müssen. Hier ist eine Möglichkeit, es zu tun. Diese Methode ist speziell für Ihre Iterationen codiert, die es ein bisschen weniger Code macht, die ein allgemeines Schema:
// fn gets called like this fn(i, j, k) and must return a promise
function iterateLevels(fn) {
var i = 1, iMax = 3;
var j = 1, jMax = 5;
var k = 1, kMax = 6;
function next() {
if (k > kMax) {
j++;
k = 1;
}
if (j > jMax) {
i++;
j = 1;
}
if (i > iMax) {
return;
}
return fn(i, j, k).then(function(result) {
k++;
// process result here
// if you want to continue processing, then
return next();
});
}
return next();
}
Hier ist eine Arbeits Demo Implementierung ein Versprechen mit einer zufälligen Verzögerung mit: https://jsfiddle.net/jfriend00/q2Lnhszt/
Die next()
Funktion mit der Die äußeren Bereichsvariablen i
, j
und k
sind im Wesentlichen eine Zustandsmaschine, bei der jedes Mal, wenn Sie next()
aufrufen, die nächste Iteration ausgeführt wird und der Status aktualisiert wird.
Dies könnte generisch gemacht werden, so dass Sie übergeben, wie viele Stufen der Iteration und was die Start-und Stop-Werte für jede Ebene sind und Sie könnten eine Funktion für die Verarbeitung des Ergebnisses übergeben. Wenn Sie es generisch machen, wird der Implementierung mehr Code hinzugefügt und die Logik wird dadurch etwas schwieriger.
ist nicht nur das so vage, es kann nicht vernünftig beantwortet werden, es ist auch fehlgeleitet. Versprechen sind async, für Schleifen nicht. Sie können nicht einfach auf ein Versprechen warten, um es zu lösen. – Claies
Bitte machen Sie ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve). – user3078414
@Claise: Ja, ich habe hier falsche Worte benutzt, sry. jfriend00 erklärt in den Antworten unten, was mein Problem ist :) – El53