拆分链时承诺链接

promise chaining when splitting the chain

在下面的代码中

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 C z

相反,我得到了: 一种 b z c

但是使用这段代码我得到了预期的结果

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

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

谁能解释一下在这种情况下 promise 链接的完成方式?

每个 then returns 你新 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');
});

时间线:

  • 初始解析 // a
  • p 独立解析 // b, z
  • a 已解决 // 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'));

您不应该依赖一级解析顺序。因为这最终会发生并且顺序实际上是未定义的(取决于内部实现)。