promise与setTimeout的执行顺序问题

29次阅读

共计 1933 个字符,预计需要花费 5 分钟才能阅读完成。

有一次在面试题中有做到 promise 与 setTimeout 的执行顺序,当时有点懵,执行顺序还是弄错了一点点,这里记录下
1. 输出
setTimeout(function() {
console.log(111)
}, 0);
setTimeout(function() {
console.log(333)
}, 1000);
new Promise(function(resolve){
console.log(444);
resolve();
console.log(555);
}).then(function(){
console.log(666);
});
console.log(777);
async function test1() {
console.log(“test1”);
await test2();
console.log(“test1 last”);
}
async function test2() {
console.log(“test2”);
}
test1();
输出结果

2. 个人理解

首先执行同步代码,然后以事件轮询的方式执行异步代码
promise 中的异步体现在.then() 和.catch() 中
而 promise 中的 function 里的是同步代码
上面的代码是先执行 promise 里的同步代码,然后执行脚本里本身的同步代码
async 无论方法是同步还是异步都可以用 async 关键字来进行标识
因为用 async 标识只是显示表明在该方法内,可能会用到 await 关键字使其变为异步方法,而且将该异步方法进行了明确的划分,只有用了 await 关键字时才是异步操作,其余一并为同步操作
同 Generator 函数一样,async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数
当函数执行的时候,一旦遇到 await 就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句
await 命令后面的 Promise 对象,运行结果可能是 rejected,所以最好把 await 命令放在 try…catch 代码块中

3. 其他
在网上还找到了一些资料
参考了这篇文章的一些内容 参考文章

setImmediate(function(){
console.log(1);
},0);
setTimeout(function(){
console.log(2);
},0);
new Promise(function(resolve){
console.log(3);
resolve();
console.log(4);
}).then(function(){
console.log(5);
});
console.log(6);
process.nextTick(function(){
console.log(7);
});
console.log(8);
输出结果:3 4 6 8 7 5 2 1
macro-task: script (整体代码),setTimeout, setInterval, setImmediate, I/O, UI rendering.
micro-task: process.nextTick, Promise(原生),Object.observe,MutationObserver
第一步. script 整体代码被执行,执行过程为
创建 setImmediate macro-task
创建 setTimeout macro-task
创建 micro-task Promise.then 的回调,并执行 script console.log(3); resolve(); console.log(4); 此时输出 3 和 4,虽然 resolve 调用了,执行了但是整体代码还没执行完,无法进入 Promise.then 流程。
console.log(6) 输出 6
process.nextTick 创建 micro-task
console.log(8) 输出 8

第一个过程过后,已经输出了 3 4 6 8
第二步. 由于其他 micro-task 的 优先级高于 macro-task。
此时 micro-task 中有两个任务按照优先级 process.nextTick 高于 Promise, 所以先输出 7,再输出 5
第三步,micro-task 任务列表已经执行完毕,家下来执行 macro-task. 由于 setTimeout 的优先级高于 setIImmediate,所以先输出 2,再输出 1。

优先级:promise.Trick()>promise 的回调 >setTimeout>setImmediate

正在努力学习中,若对你的学习有帮助,留下你的印记呗(点个赞咯 ^_^)

往期好文推荐:

判断 iOS 和 Android 及 PC 端
纯 css 实现瀑布流(multi-column 多列及 flex 布局)
实现多行文字及单行的省略号
微信小程序之购物车和父子组件传值及 calc 的注意事项

正文完
 0