2016-05-18 6 views
3

Im folgenden Code AufspaltenVersprechen verketten, wenn die Kette

var p = new Promise((resolve, reject) => { 
    console.log('a'); 
    resolve(); 
}); 

p.then(() => {  
    console.log('b'); 

}).then(() => {  
    console.log('c');  
}); 

p.then(() => { 
    console.log('z'); 
}) 

ich die Konsolenausgabe erwarten zu sein: a b c z

Stattdessen bekam ich: ein b z c

aber mit diesem Code habe ich das erwartete Ergebnis

var p = new Promise((resolve, reject) => { 
    console.log('a'); 
    resolve(); 
}).then(() => {  
    console.log('b'); 
}).then(() => {  
    console.log('c');  
}); 

p.then(() => { 
    console.log('z'); 
}) 

Kann jemand erklären, wie die Verkettung in diesem Fall funktioniert?

Antwort

0

Jeder then gibt Ihnen Promise zurück, die von der Rückrufauflösung abhängt.

Das ist der Unterschied.

var p = new Promise((resolve, reject) => { 
    console.log('a'); 
    resolve(); 
}); 

var a = p.then(() => {  
    console.log('b'); 

}); 
a.then(() => {  
    console.log('c');  
}); 

p.then(() => { 
    console.log('z'); 
}); 

Timeline:

  • anfängliche Entschlossenheit // a
  • p aufgelöst // b, z unabhängig
  • ein aufgelöster // c

Im zweiten Fall Ihre p Punkte auf Versprechen zurückgegeben von letzten then:

var a = new Promise(foo('a')); 
var b = a.then(foo('b')); 
var p = b.then(foo('c')); 
p.then(foo('z')); 

Sie sollten sich nicht auf eine auflösende Reihenfolge auf einer Ebene verlassen. Weil dies schließlich geschieht und die Reihenfolge wirklich nicht definiert ist (abhängig von der internen Implementierung).