一段时间以来,我认为链接.then()
语句的唯一方法是从.then方法返回一个promise。 e。 g。:
asyncFunc()
.then(res => asyncFunc2()) // returns a promise
.then(res => doSmth())
但是现在我发现您实际上还可以从.then函数返回一个简单的旧值,它也可以工作:
const build = () => new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Hallo")
}, 100)
})
build()
.then(res => {
console.log(res);
return res + " I'm";
})
.then(res => {
console.log(res + " Peter");
})
两者的执行方式和执行时间是否有所不同?
答案 0 :(得分:2)
每个.then()
方法调用都返回一个诺言,如果回调函数的返回值也是一个诺言,则.then()
方法调用返回的诺言将解析为该诺言,这意味着其命运现在将取决于回调函数返回的promise发生了什么。当回调函数返回的promise成立时,它将解决。
另一方面,如果您返回一个非承诺值,则该值将隐式包装在一个Promise中,并传递给下一个.then()
方法调用(如果有)。如果您没有从回调函数返回任何内容,则.then()
方法返回的promise将以undefined
的值解析。
在第一个代码示例中,当您从第一个asyncFunc2()
方法的回调函数返回.then()
时,它返回的承诺将解析为asyncFunc2()
返回的承诺。 / p>
在第二个代码示例中,res + " I'm"
将隐式包装在一个promise中,然后传递给第二个then()
方法。