打破承诺链

Breaking up promise chain

为什么它们不等价,有没有办法让它们等价?

// 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;

第一个 return 是一个组合承诺(只有当 promiseA 已解决且 promiseB 已 运行 时才会解决)。

在第一种情况下,p 是 运行ning self.promiseA().then(); 的结果,这是一个超越 self.promiseA() return 的新承诺。


第二个 returns 只是第一个承诺,它只是 self.promiseA() returns.


有一件事在 .then() 中并不总是很明显,我们会在 运行 之前的承诺实现后才想到它,但事实并非如此。整个 .then() 链立即 运行。函数指针被存储起来供以后调用(当 promises 被履行时),但是整个链 运行 立即并且每次调用 .then() 都会创建一个新的 promise,其履行时间和结果可能与链中的前一个(这取决于每个 .then() 回调在被调用时执行的操作)。

所以 self.promiseA()self.promiseA.then(xxx) return 不是一回事。后者是一个新的承诺,它结合了第一个承诺和 运行 宁 .then() 处理程序的结果。


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

var p = self.promiseA();

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

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