例子浏览器
执行顺序:异步
eg:执行一个耗时 1 秒的 Promise。
即便耗时一秒的 c1 执行完毕,再 enque 的 c2,仍然先于 d 执行了,这很好地解释了微任务优先的原理。函数
setTimeout(()=>console.log("d"), 0) var r1 = new Promise(function(resolve, reject){ resolve() }); r.then(() => { var begin = Date.now(); // 强制了 1 秒的执行耗时,这样,咱们能够确保任务 c2 是在setTimeout d后加入任务队列 while(Date.now() - begin < 1000); console.log("c1") new Promise(function(resolve, reject){ resolve() }).then(() => console.log("c2")) });
如何分析异步执行的顺序:操作系统
eg:
setTimeout 把整个代码分割成了 2 个宏观任务,这里不管是 5 秒仍是 0 秒,都是同样的。
第一个宏观任务中,包含了前后同步执行的 console.log(“a”); 和 console.log("b")
setTimeout 后,第二个宏观任务执行调用了resolve,而后 then 中的代码异步获得执行,因此调用了 console.log(“c”),最终输出的顺序才是a,b,ccode
function sleep(duration) { return new Promise(function(resolve, reject) { console.log("b"); setTimeout(resolve,duration); }) } console.log("a"); sleep(5000).then(()=>console.log("c"));