javascript - 如果 Promise 尚未解决,那么之后的代码如何运行?
问题描述
当我们链接Promise 的using 链时,Promise 由then返回,那么不属于then链的代码如何在 all 链完成之前运行?代码如何跳转然后调用?不应该在运行“console.log”代码行之前执行所有调用吗?
这是代码:
Promise.resolve('333')
.then((res)=>{console.log(res);return new Promise((resolve,reject)=> {setTimeout(function(){console.log('Timeout');resolve(1);},10000);console.log('Something');})})
.then((res)=>{console.log(res);return new Promise((resolve,reject)=> {console.log('Something');resolve(2);})})
.then((res)=>{console.log(res);return new Promise((resolve,reject)=> {console.log('Something');resolve(3);})})
.then((res)=>{console.log(res);return new Promise((resolve,reject)=> {console.log('Something');resolve(4);})})
console.log("When?")
在输出“什么时候?” 正在首先打印.. 现在我无法理解这怎么可能,因为第一个回调将仅在大约 10 秒内运行,只有在那之后,回调才会返回一个 Promise,然后运行第二个?也许我不明白 then 的回调如何“与” then 函数一起使用。我认为然后实现看起来有点像:
then(callback){
let value= callback();
if(value is promise){
return value;
}
return Promise.resolve(value)
}
解决方案
好问题。答案是评估 JavaScript 的事件循环。简而言之,有微任务和宏任务。控制台日志是宏任务,promise 是微任务。事件循环首先处理宏任务,然后是微任务。
有关更深入的解释,请参阅:https ://medium.com/javascript-in-plain-english/javascript-event-loop-y-promises-951ba6845899
问题中有一段代码几乎相同。搜索console.log('start');
找到它。
推荐阅读
- swift - 无法在 Swift 中将日期格式转换为显示日期
- firebase - 使用 UID 从 Cloud Firestore 查询 - 无返回无错误
- kotlin - Kotlin App 以编程方式广泛更改 TextView 颜色
- python - 试图以访问权限禁止的方式访问套接字 (Bottle) (Python)
- java - Android 计步器不工作,没有出现在 SensorManager 中
- python - 使用 Flask 应用程序拆解请求有技巧吗?
- r - 为什么 compareGroups 中的表格不能在 Rmarkdown PDF 中正确显示?
- javascript - JavaScript、循环和函数式方法
- html - 如何使 html 文本用圆形边框包围自己,类似于非活动按钮?
- weblogic - Weblogic 12c JMX 会话管理