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
解析:
知识点:
考察的是js中的事件循环和回调队列。注意以下几点
Promise优先于setTimeout宏任务。所以,setTimeout回调会在最后执行。Promise一旦被定义,就会立即执行Promise的reject和resolve是异步执行的回调。所以,resolve()会被放到回调队列中,在主函数执行完和setTimeout前调用。await执行完后,会让出线程。async标记的函数会返回一个Promise对象迷惑点
async function async1() {
console.log('async1 start');
await async2();
console.log('async1 end');
}
async function async2() {
console.log('async2');
}
// 相当于
function async1() {
return new Promise((resolve,reject)=>{
console.log('async1 start');
async2().then((result)=>{
console.log('async1 end');
})
resolve()
})
}
function async2() {
return new Promise((resolve)=>{
console.log('async2');
resolve()
})
}
执行流程分析
console.log('async1 start');
async1().then((result)=>{
console.log('async1 end');
})
这一块写错了吧,async2()写成async1()了
console.log('async1 start');
async1().then((result)=>{
console.log('async1 end');
})
这一块写错了吧,async2()写成async1()了
@yaokangsong 感谢指正Thanks♪(・ω・)ノ,答案已修正
给大家出个题,把第3行的await去掉,输出的结果会变成什么?
Most helpful comment
答案:
script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout
解析:
知识点:
考察的是js中的事件循环和回调队列。注意以下几点
Promise优先于setTimeout宏任务。所以,setTimeout回调会在最后执行。Promise一旦被定义,就会立即执行Promise的reject和resolve是异步执行的回调。所以,resolve()会被放到回调队列中,在主函数执行完和setTimeout前调用。await执行完后,会让出线程。async标记的函数会返回一个Promise对象迷惑点
执行流程分析