2017-06-10 4 views
0

Ich habe gerade das Konzept von Promise.all() gelernt und bin neugierig auf seinen Mechanismus. Aus meiner begrenzten Kenntnis von Promise übergibt es eine Callback-Funktion in der .then() -Methode und ruft sie in der Definition auf. Zum Beispiel:Wann ist Rückruf von Promise.all() ausgelöst

var p = new Promise((resolve) => { 
 
    setTimeout(resolve, 2000); 
 
    setTimeout(() => { 
 
    console.log('4 sec function'); 
 
    }, 4000); 
 
}); 
 

 
p.then(() => { 
 
    console.log('2 sec function'); 
 
});

// result: 
// 2 sec function 
// 4 sec function 

Wenn wir jedoch Promise.all() verwenden, löst es der Rückruf, wenn alle Versprechen erfüllt. Wie ich vermute, löst es den Rückruf im Versprechen aus, das zuletzt erfüllt wird. Im folgenden Fall wäre meine Sichtweise des Ergebnisses "vier". Es druckt jedoch ein Array der vier Zahlen. Warum passiert das? Genauer gesagt:

  1. Wie oft wird der Callback tatsächlich ausgelöst?

  2. an welcher Position in der Verheißungsdefinition wird der Callback ausgelöst?

  3. Welcher Wert wird an den Callback übergeben?

Hier ist der Code, den ich tun Forschung auf:

var p1 = new Promise((resolve, reject) => { 
 
    setTimeout(resolve, 1000, 'one'); 
 
}); 
 
var p2 = new Promise((resolve, reject) => { 
 
    setTimeout(resolve, 2000, 'two'); 
 
}); 
 
var p3 = new Promise((resolve, reject) => { 
 
    setTimeout(resolve, 3000, 'three'); 
 
}); 
 
var p4 = new Promise((resolve, reject) => { 
 
    setTimeout(resolve, 4000, 'four'); 
 
}); 
 

 
Promise.all([p1, p2, p3, p4]).then(values => { 
 
    console.log(values); 
 
});

// print: 
// one 
// two 
// three 
// four 
+2

[Dokumentation] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all) sagt Ihnen alles, was Sie –

+0

Dank wissen müssen @JaromandaX ich – zhangjinzhou

Antwort

1
  1. Der Rückruf einmal ausgelöst wird.

  2. Entweder, wenn alle Versprechen gelöst sind oder wenn einer von ihnen fehlschlägt.

  3. Es empfängt ein Array der Werte, die alle Versprechen gelöst haben.

+0

lese Ich kann mir also nicht vorstellen, den Callback irgendwo in den Code einzufügen, der die Versprechen definiert, oder? – zhangjinzhou

+0

Nein. Der springende Punkt von 'Promise.all()' ist, dass Sie eine Menge Dinge beginnen und dann etwas tun wollen, wenn alle fertig sind. Deshalb heißt es "alles". – Barmar

+0

@zhangjinzhou Ein Anwendungsfall für die Verwendung von Promise.all würde mehrere Datenbankmethoden gleichzeitig ausführen ...Damit Sie nicht warten müssen, bis jeder den nächsten auslöst (vielleicht hilft Ihnen das, Versprechen zu verstehen. Alles besser). Wenn ich mehrere Datenbankmethoden gleichzeitig hinzufügen würde, würde dies bedeuten, dass die Callback-Methode ALLE Ergebnisse von jeder der db-Methoden enthalten würde. – James111

0

Promise.race

Es gibt auch Promise.race die resolve oder reject, sobald die ersten der Versprechungen (p1, p2, p3 oder p4) lösen oder ablehnen

// note: i've adjusted the delays from your original code 
 
var p1 = new Promise((resolve, reject) => { 
 
    setTimeout(resolve, 4000, 'one'); 
 
}); 
 
var p2 = new Promise((resolve, reject) => { 
 
    setTimeout(resolve, 3000, 'two'); 
 
}); 
 
var p3 = new Promise((resolve, reject) => { 
 
    setTimeout(resolve, 2000, 'three'); 
 
}); 
 
var p4 = new Promise((resolve, reject) => { 
 
    setTimeout(resolve, 1000, 'four'); 
 
}); 
 

 
Promise.race([p1, p2, p3, p4]).then(fastest => { 
 
    console.log(fastest); // four 
 
});

+0

Es ist mir nicht klar, dass Sie tatsächlich ein Problem haben. Ich gebe diese Antwort, weil ich denke, dass es für Sie nützlich sein könnte^_ ^ – naomik

Verwandte Themen