2016-05-18 75 views
3

時,在下面的代碼鏈接承諾分裂鏈

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

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

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

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

我希望控制檯輸出爲: 一個 b Ç ž

相反,我得到了: 一個 b ž c

但用此代碼我得到了預期的結果

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

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

任何人都可以解釋承諾鏈接在這種情況下完成的方式嗎?

回答

0

每個then都會返回新的Promise,這取決於回撥分辨率。

這是不同之處。

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'); 
}); 

時間軸:

  • 初始決心//一個
  • p解決// B,Z獨立地
  • 一個解決// C

在第二情況下,你p點最後回覆then

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

您不應該依靠一級解析順序。因爲這最終發生,訂單是不確定的(取決於內部實施)。