别人长文我短文--你知道setTimeout、Promise、Async/Await 的区别吗?都是异步??

107 阅读1分钟

看一下别人的回答:--总结的很到位

主要是考察这三者在事件循环中的区别,事件循环中分为宏任务队列和微任务队列。
其中settimeout的回调函数放到宏任务队列里,等到执行栈清空以后执行;

promise.then里的回调函数会放到相应宏任务的微任务队列里,等宏任务里面的同步代码执行完再执行;

async函数表示函数里面可能会有异步方法,await后面跟一个表达式,async方法执行时,
遇到await会立即执行表达式,然后把表达式后面的代码放到微任务队列里,让出执行栈让同步代码先执行。

settimeout没啥好说的,就是丢到异步栈执行,时间到了,将结果放到队列里面--宏任务

Promise先执行同步代码,Promise.then是微任务最后执行

async: 遇到await,立即执行await内容,然后将其后面内容放到微任务队列,让同步代码执行

--下面情况主要区分await的内容是同步代码和异步代码情况--其实还是遵守宏微任务规则

async function dofn(params) {
    console.log(1);
    await setTimeout(()=>{
        console.log(2);
    },0)
    console.log(3);
    await console.log(4);
    console.log(5);
}
console.log(6);
dofn()
console.log(7);

输出
6
1
7
3
4
5
2


async function name(params) {
    console.log(1);
    await console.log(2);
    console.log(3);
    await console.log(4);
    console.log(5);
}
console.log(6);
name()
console.log(7);

6
1
2
7
3
4
5

一个混合题目:下面的输出结果

async function async1() {
    console.log('async1 start');
    await async2();
    console.log('async1 end');
}
async function async2() {
    console.log('async2');
}
console.log('script start');
setTimeout(function() {
    console.log('setTimeout');
}, 0)
async1();
new Promise(function(resolve) {
    console.log('promise1');
    resolve();
}).then(function() {
    console.log('promise2');
});
console.log('script end');


/**
 * script start
 * async1 start
 * async2
 * promise1
 * script end
 * async1 end
 * promise2
 * setTimeout
 */