Versprechen.alle() ist keine Lösung verspricht, in der erwarteten Reihenfolge
Wenn ich verstehe, Versprechen.alle() richtig, ich würde erwarten, dass dieser code zu nehmen, 5 Sekunden vor der Ausgabe nur der Grund für die abgelehnte Versprechen an die Konsole.
function firstAsyncFunction() {
return new Promise(function(resolve, reject){
setTimeout(function(){
resolve(console.log('First async function has been resolved!'));
}, 500);
});
}
function secondAsyncFunction() {
return new Promise(function(resolve, reject) {
setTimeout(function(){
resolve(console.log('Second async function has been resolved!'));
}, 2000);
});
}
function thirdAsyncFunction() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
reject('Internal server error'); //rejected for some reason
}, 5000);
});
};
Promise.all([secondAsyncFunction(), firstAsyncFunction(), thirdAsyncFunction()])
.then(function(values){
values.forEach(function(value){
console.log(value);
});
}).catch(function(err){
console.log(err);
});
Statt, die ersten beiden Versprechen lösen, dann die endgültige Versprechen ablehnt. Darüber hinaus werden die ersten beiden Versprechen nicht selbst auflösen, in der Reihenfolge, in der Sie übergeben werden, zu Versprechen.alle(). Muss ich Komponieren meine verspricht anders zu sehen, das Verhalten, das ich erwarte?
Bearbeitet
Versprechen.alle() ist in der Tat warten, bis die Versprechungen in der iterierbar an Sie übergeben beheben. Mein Erster Anhaltspunkt war die Tatsache, dass die Konsole die Ausgabe undefiniert (Dank Jaromanda X). Wenn ich entfernen Sie die Anrufe auf die Konsole.log() in der Auflösung zu firstAsyncFunction() und secondAsyncFunction() das folgende Stück code funktioniert genau so wie ich es erwarten würde:
function firstAsyncFunction() {
return new Promise(function(resolve, reject){
setTimeout(function(){
resolve('First async function has been resolved!');
}, 1000);
});
}
function secondAsyncFunction() {
return new Promise(function(resolve, reject) {
resolve('Second async function has been resolved!');
});
}
function thirdAsyncFunction() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
reject('Internal server error');
}, 5000);
});
};
Promise.all([
thirdAsyncFunction(),
firstAsyncFunction(),
secondAsyncFunction()
])
.then(function(values){
values.forEach(function(value){
console.log(value);
});
})
.catch(function(err){
console.log(err);
});
Nach fünf Sekunden sehe ich "Internal server error". Versprechen.alle() lehnt die andere verspricht, obwohl Sie beheben früher, als das Versprechen, dass abgelehnt wurde. Und ja, die Werte gelöst Versprechen.alle() werden in der gleichen Reihenfolge wie die Versprechungen in der iterierbar als parameter übergebenen. Vielen Dank für Ihre Hilfe!
Noch ein Beispiel:
function firstAsyncFunction() {
return new Promise(function(resolve, reject){
setTimeout(function(){
resolve('First async function has been resolved!');
}, 1000);
});
}
function secondAsyncFunction() {
return new Promise(function(resolve, reject) {
resolve('Second async function has been resolved!');
});
}
function thirdAsyncFunction() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve({
users: [
{ name: 'Ronnie', age: 22 },
{ name: 'Bobby', age: 21 },
{ name: 'Ricky', age: 21 },
{ name: 'Mike', age: 20 }
]
});
}, 5000);
});
};
Promise.all([thirdAsyncFunction(), firstAsyncFunction(), secondAsyncFunction()])
.then(function(values){
values.forEach(function(value){
console.log(value);
});
})
.catch(function(err){
console.log(err);
});
Nach fünf Sekunden, wird dieser code ausgegeben:
{ users:
[ { name: 'Ronnie', age: 22 },
{ name: 'Bobby', age: 21 },
{ name: 'Ricky', age: 21 },
{ name: 'Mike', age: 20 } ] }
First async function has been resolved!
Second async function has been resolved!
Genau das, was wir wollen.
Promise.all
ist irrelevant.torazaburo, das ist nicht ganz richtig. Die Werte gelöst Versprechen.alle() werden in der gleichen Reihenfolge wie die iterierbar übergeben Sie als parameter.
Die wichtige Sache zu erkennen ist hier, dass verspricht Darstellung des die Ergebnisse der bereits in Betrieb. Damit alle Betreiber, die nimmt Versprechen und keine Funktionen für verspricht nicht etwas aufzwingen wirklich.
InformationsquelleAutor James Hines | 2015-08-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versprechen.alle nicht verhängen, um Sie an die Versprechen, die Sie erfüllen, wenn Sie erfüllen
Dritten Versprechen "lehnt" auch nach den beiden anderen "aufzulösen", also die Tatsache, dass die ersten beiden behoben werden, bevor das Letzte wird abgelehnt, ist zu erwarten,
durch die Art und Weise, Ihre beiden ersten Versprechen der Lösung den Wert
undefined
- und Ausgabe auf der Konsole - das ist, warum Sie denken vielleicht, dass Versprechen.alle, tut etwas, was er nicht hätte tunWerden Sie nicht bekommen, genau die Verhalten, die Sie erwarten, weil Sie erwarten, dass die Versprechen, die zu lösen in einer bestimmten Reihenfolge, ist der einzige Weg, das passieren kann, ist, auf die Verheißung zu warten, bis die Vorherige erfüllt werden, bevor es zu erfüllen, also die Zeit wäre kumulierten, nicht parallel, so in diesem Fall werden Sie nicht bekommen, die Absage für 7,5 Sekunden, statt der 5 Sekunden, die Sie "erwarten"
InformationsquelleAutor Jaromanda X
Den
then
oder diecatch
Funktion Versprechen.alles wird nur einmal aufgerufen, all die Versprechen, die beschlossen haben oder eines der Versprechen wurde abgelehnt. Die einzelnen Versprechungen auflösen können in beliebiger Reihenfolge (das ist der ganze Punkt der Verheißungen - Sie sind asynchrone und abschließen können, was Sie sollen, Wann immer Sie wollen)Sagte, es wäre klarer, wenn Sie tagged Ihre, Versprechen.alle Konsolen.log anders, wie so
Konnte man mischen bis die Konsole.Protokolle in der Verheißung und der in den
then
Rückruf.InformationsquelleAutor potatopeelings
Nur hinzufügen, was andere gesagt haben.
Versprechen.alle nicht sequenziell ausgeführt werden.
Hier ist ein Beispiel für das ausführen von asynchronen Funktionen nacheinander in ES6
Funktioniert auf meinem Ende. Iv aktualisiert das Beispiel, um zu zeigen, das vollständige Beispiel. jsfiddle.net/Bodman/8hp1p8cm
[foo, boo, baz]
sind keine Versprechungen. Sie sind Funktionen, die Rendite verspricht. Ihr code, der explizit kommentiertpromises
ist eine Reihe von Versprechungen würden nicht typecheck.Ja, guter Fang. Sieht aus wie es bricht auf Ablehnung. Ich werde das beheben.
Ah verdammt, ja, das ist richtig
InformationsquelleAutor Bodman
Promise.all
läuft alle Versprechungen, die Sie geben es parallel an. Dies ist nützlich, wenn die Versprechungen nicht voneinander abhängen und die Sie durchführen müssen, beide. Zum Beispiel, in einem integration test, wo Sie brauchen, um zu registrieren, das zwei clients mit einem server. Sie müssen warten, für Sie beide zu beenden, aber die starten beide zur gleichen Zeit schneiden Sie Ihre warten Sie ungefähr in der Mitte.Wenn Sie möchten, führen Sie Sie der Reihe nach, könnten Sie Ihre Kette Verspricht, und gibt das Ergebnis zurück von einem zum nächsten:
Wenn Sie schauen, um aggregierte Daten zurück, die aus allen drei Anrufe, die Sie würde auch wollen, ändern Sie Ihre Versprechungen zurück, die Ihren Wert in einem array (oder Objekt). Zum Beispiel:
userId
und zurück{ name: 'Bob' }
userObject
und zurück{ name: 'Bob', car: 'Porsche' }
userObject
und zurück{ name: 'Bob', car: 'Porsche', kids: 5 }
InformationsquelleAutor rrowland