javascript - 打破 promise 链

标签 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;

最佳答案

第一个返回一个组合的 Promise(只有当 PromiseA 被解析并且 PromiseB 被运行时才会被解析)。

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

<小时/>

第二个仅返回第一个 promise ,即 self.promiseA()返回。

<小时/>

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

所以self.promiseA()不会返回与 self.promiseA.then(xxx) 相同的内容。后者是一个新的 Promise,其中包含第一个 Promise 和运行 .then() 的结果。处理程序。

<小时/>

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

var p = self.promiseA();

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

如果您尝试返回累积或组合的 Promise,那么您需要返回 p.then() 的结果,不仅仅是 p .

关于javascript - 打破 promise 链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29042208/

相关文章:

javascript - 将 jQuery.Deferred 对象传递给 deferred.resolve 时,jQuery.Deferred 是否存在错误?

javascript - 使用 knex.js 插入嵌套记录

javascript - layout() 函数如何在节点集合上工作?

javascript - Mongo 的动态下拉菜单

javascript - 在ajax中添加简单的GET或POST?

javascript - 等待 promise - 代码挂起

javascript - 无法处理其他 promise 中的 promise 失败

javascript - 将 Promise 代码从 Q 转换为 bluebird

javascript - 嵌套的 For 循环转换为嵌套的 Promises

javascript - 我的 javascript setinterval 循环乘以 2 而不是加 1