当我们使用链链接承诺的,并且承诺由然后返回时,那么不是一部分的代码如何在完成链之前运行链呢?代码如何跳过然后调用?难道不应该在运行"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秒内运行,然后回调将返回一个承诺,运行第二个,然后运行?也许我不明白然后的回调是如何与当时的函数“匹配”的。我认为然后实现看起来有点像:
then(callback){
let value= callback();
if(value is promise){
return value;
}
return Promise.resolve(value)
}发布于 2021-01-09 23:43:20
问得好。答案是事件循环,它评估JavaScript。简而言之,有微任务和宏任务。控制台日志是宏任务,承诺是微任务。事件循环首先处理宏任务,然后处理微任务。
有关更深入的解释,请参见:https://medium.com/javascript-in-plain-english/javascript-event-loop-y-promises-951ba6845899
问题中有一个部分的代码几乎是相同的。搜索console.log('start');来找到它。
https://stackoverflow.com/questions/65647954
复制相似问题