在分裂链时承诺链接

时间:2016-05-18 12:46:45

标签: node.js promise bluebird

在以下代码中

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 ž

相反,我得到了: 一个 b ž ç

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

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

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

在这种情况下,有人可以解释保证链接的方式吗?

1 个答案:

答案 0 :(得分: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'));

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