promise,async,await基础:promise,async,await基础入门地址
题目来源:https://segmentfault.com/a/1190000015057278?utm_source=index-hottest
面试题代码:
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
promise2
async1 end
setTimeout
知识点:
Promise
优先于setTimeout
宏任务。所以,setTimeout
回调会在最后执行。Promise
一旦被定义,就会立即执行。Promise
的reject
和resolve
是异步执行的回调。所以,resolve()
会被放到回调队列中,在主函数执行完和setTimeout
前调用。await
执行完后,会让出线程。async
标记的函数会返回一个Promise
对象
流程:
console.log('script start')
输出:script start
setTimeout
被放在最后调用- 执行
async1
函数,输出async1 start
。然后,进入async2
函数,输出async2
,并返回Promise
对象。回到async1
,由于await
,让出线程,async2
函数返回的Promise
放在回调队列。 - 新new了一个
Promise
对象,输出promise1
。其中的resolve()
被放在回调队列。 console.log('script end')
输出:script end
- 执行回调队列中,
async1
返回的Promise
对象,对象产生的resolve
被放入对调队列。这里不输出任何值。 - 执行回调队列中,下方
Promise
显式声明的resolve
,输出promise2
。 - 执行回调队列中,由于
async1
函数返回的promise
对象的resolve
,输出async1 end
。 - 执行回调队列中,最后的
setTimeout
,输出setTimeout