为什么这些不相同,有没有办法让它们如此?
// 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;
答案 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
。