打破承诺链

时间:2015-03-13 21:24:26

标签: javascript promise bluebird

为什么这些不相同,有没有办法让它们如此?

// Returns result of promiseB
var p = self.promiseA()
  .then(self.promiseB);
return p;


// Returns result of promiseA
var p = self.promiseA();
p.then(self.promiseB);
return p;

例如,如果我想做类似的事情:

var p = self.promiseA();

if(cond) {
  p.then(self.promiseB);
}
return p;

1 个答案:

答案 0 :(得分:1)

第一个返回一个组合的promise(仅当promiseA已经解析且promiseB已经运行时才会解析)。

在第一种情况下,p是运行self.promiseA().then();的结果,这是self.promiseA()返回的新承诺。


第二个只返回第一个只有self.promiseA()返回的承诺。


.then()并不总是显而易见的一点是,我们认为它就像在履行之前的承诺之后运行,但事实并非如此。整个.then()链立即运行。函数指针被存储起来以便稍后调用(当完成promises时),但是整个链立即运行,并且每次调用.then()都会创建一个新的promise,它可以具有与链中的前一个不同的执行时间和结果(这取决于每个.then()回调在被调用时的作用。)

因此self.promiseA()不会返回与self.promiseA.then(xxx)相同的内容。后者是一个新的承诺,它包含运行.then()处理程序的第一个承诺和结果。


如果你想做有条件的,你可以这样做:

var p = self.promiseA();

if(cond) {
  p = p.then(self.promiseB);
}
return p;

如果您尝试返回累积或合并的承诺,则需要返回p.then()的结果,而不仅仅是p