javascript - .then 方法中链接承诺与值之间的区别?
问题描述
有一段时间,我认为链接.then()
语句的唯一方法是从 .then 方法返回一个承诺。例如:
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");
})
两者在执行方式和时间方面有区别吗?
解决方案
每个.then()
方法调用都会返回一个promise,如果回调函数的返回值也是一个promise,那么.then()
方法调用返回的promise会被解析为该promise,这意味着它的命运现在将取决于回调返回的promise会发生什么功能。当回调函数返回的promise 解决时,它会解决。
另一方面,如果您返回一个非承诺值,那么该值将隐式包装在一个承诺中并传递给下一个.then()
方法调用(如果有的话)。如果您没有从回调函数返回任何内容,则该.then()
方法返回的 Promise 将解析为undefined
.
在第一个代码示例中,当您asyncFunc2()
从第一个方法的回调函数.then()
返回时,它返回的承诺将被解析为asyncFunc2()
.
在第二个代码示例中,res + " I'm"
将隐式包装在一个 Promise 中,然后传递给第二个then()
方法。
推荐阅读
- r - ggplot2中注释的控制字体
- node.js - 如何在 eslint yaml 文件的扩展中使用一组以上的规则?
- java - Java - 如何将列表位置拉为整数?
- javascript - 如何创建具有均匀间距的虚线圆圈?
- python - Tensorflow - 使用 tflite 将修剪后的模型转换为较低的量化
- xml - 500 内部服务器错误:对象引用未设置为对象的实例。使用 springboot restTemplate 发布请求
- php - 为什么这个错误会出现在命令提示符中?
- windows - 在 PowerShell 和命令提示符上选择某些内容时避免暂停任务
- function - Clojure:如何将映射与匿名函数一起使用?
- karate - 在空手道的 JSON 响应中从数组中获取最大值