首页 > 解决方案 > 如果 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)
}

标签: javascriptasynchronous

解决方案


好问题。答案是评估 JavaScript 的事件循环。简而言之,有微任务和宏任务。控制台日志是宏任务,promise 是微任务。事件循环首先处理宏任务,然后是微任务。

有关更深入的解释,请参阅:https ://medium.com/javascript-in-plain-english/javascript-event-loop-y-promises-951ba6845899

问题中有一段代码几乎相同。搜索console.log('start'); 找到它。


推荐阅读