为什么这些不等价,有没有办法让它们等价?
// 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/