KeyWords:宏(微)任务队列、阻塞非阻塞(强调线程状态)、同步异步强调一种“机制”
任务是连续的(同步)、不连续(异步)
1, setTimeout
// setTimeout(回调函数在宏任务队列中。最后才执行)
console.log('script start')
setTimeout(function(){
console.log('settimeout')
})
console.log('script end')
// 输出顺序:script start->script end->settimeout
2,Promise
// Promise(then之前的代码顺序执行,then里的回调函数放在宏任务里的微任务中。
// 等宏任务里面的同步代码执行完再执行)
console.log('script start')
let promise1 = new Promise(function (resolve) {
console.log('promise1')
resolve()
console.log('promise1 end')
}).then(function () {
console.log('promise2')
})
setTimeout(function(){
console.log('settimeout')
})
console.log('script end')
// 输出顺序: script start->promise1->promise1 end->script end->promise2->settimeout
3,async / await
/* async函数表示函数里面可能会有异步方法,await后面跟一个表达式,
async方法执行时,遇到await会立即执行表达式,
然后把表达式后面的代码放到微任务队列里,让出执行栈让同步代码先执行。*/
async function async1(){
console.log('async1 start');
await async2();
console.log('async1 end')
}
async function async2(){
console.log('async2')
}
console.log('script start');
async1();
console.log('script end')
// 输出顺序:script start->async1 start->async2->script end->async1 end
其实async返回的是一个Promise,所以可以在后面.then(),如下面
async function func1() {
return 1
}
func1().then(res => {
console.log(res)
})
网友评论