2017-03-14 8 views
0

Ich verwende die Kriskowal Q library Versprechen zu halten.Lösen von Versprechen synchron mit Q.all (Versprechen)

Ich schrieb die folgende Funktion zu warten, bis alle Versprechen gelöst worden sind.

function multiplePromises(targetArray) { 
    var promises = {}; 
    for (var i=0; i<targetArray.length; i++) { 
     var promise = singlePromise(); // any async. function 
     promises[i] = promise; 
    }; 
    return Q.all(promises); 
}; 

und ich nenne es wie folgt: (zum Beispiel ist es synchron)

multiplePromises(targetArray).then(
    function(success){ 
     console.log("success"); 
    }, 
    function(error){ 
     console.log("error", error); 
    } 
); 

Ich frage mich jedoch, ob es eine Ordnung, in der die Versprechungen werden aufgelöst. I.e. wartet die Funktion, um das nächste Versprechen i+1 auszulösen, bis das Versprechen i gelöst ist? Oder alternativ ist es wie bei allen anderen Async. Methoden, dass es tatsächlich alle einzelnen Versprechen feuert und nur wartet, bis sie alle fertig sind?

Wenn die zweite der Fall ist, wie würde man diese Funktion umschreiben, um sicherzustellen, dass Versprechen i+1 NUR ausgelöst wird, sobald Versprechen i gelöst wurde?

Update: Test

habe ich einen Test und setzen:

promises[i] = i; 

zu prüfen, ob es löst sycnhronously und es scheint der Fall ist. Es könnte jedoch nur sein, dass meine Async-Funktion schnell genug ist, um sie so schnell zu lösen. Scheint das richtig?

+0

werden jedes Mal, wenn Sie schreiben 'sycnhronously' Ich denke du meinst' serially' - denn es gibt absolut nichts Synchron über Versprechen –

+0

Clear. Irgendwelche Gedanken, wie man es "seriell" macht? – JohnAndrews

+0

ja, sehr leicht, wenn ich nur das 'Q'-Äquivalent von' Promise.resolve() 'würde –

Antwort

1

gibt es mehrere Möglichkeiten zu erreichen, was Sie wollen

Minimale Änderung würde, um Ihren Code

function multiplePromises(targetArray) { 
    var promises = []; 
    var p = Promise.resolve(); // I don't know the Q equivalent of this 
    for (var i=0; i<targetArray.length; i++) { 
     p = p.then(function() { 
      return singlePromise(); 
     }); 
     promises[i] = p; 
    }; 
    return Q.all(promises); 
}; 
+0

Großartig! Was ist das Versprechen in "Versprechen [i] = Versprechen"? Sollte es das 'p' sein? – JohnAndrews

+0

Entschuldigung, das stimmt –

0

Die Versprechen werden von Q in der Reihenfolge ausgeführt, in der Sie sie deklarieren, aber es gibt keine Möglichkeit, sicherzustellen, dass die Rückgabebestellung gleich ist. So funktioniert Async.

Wenn Sie wollen, dass sie sich in der richtigen Reihenfolge auflösen, kann ich sie nur nacheinander aufrufen, anstatt sie im Stapel zu tun.

Diese andere Antwort wird weitere Informationen und einige Lösungen bieten: https://stackoverflow.com/a/36795097/7705625

0

Promises in der Theorie, um aufgelöst werden können (und es könnte ein Beispiel schreiben leicht sein, in dem sie würden), aber Sie sollten auf nicht zählen Das.

Der ganze Sinn von Funktionen wie Promise.all() (oder Q.all() oder Bluebird.all() etc.) ist, dass, wenn wartet auf all den Versprechungen entschlossen zu erhalten, egal, was die Reihenfolge der das heißt, und sobald sie alle gelöst werden dann Das Versprechen, dass die Promise.all() selbst zurückgibt, wird mit einem Array von Werten aufgelöst, die die ursprünglichen Versprechen gelöst haben.

In diesem Array erhalten Sie immer die gleiche Reihenfolge wie die Reihenfolge der Versprechen im Array, das ein Argument für Promise.all() war. Aber die Reihenfolge, in der die ursprünglichen Versprechen gelöst wurden, ist nicht bekannt und nicht relevant, da dies keinerlei Auswirkungen auf das Ergebnis der Verwendung von Promise.all() haben wird.

+0

Ja, aber in meinem Fall muss ich es wirklich in der Reihenfolge lösen, da das vorherige Versprechen einen Einfluss auf das nächste Versprechen hat. – JohnAndrews

Verwandte Themen