运行代码段并查看它们的持续时间,您会发现第一个代码段在执行
billion loops done
之前执行log('Synchronous 2')
。它花费了0毫秒,但是第二个使用async关键字的代码段将阻止log('Synchronous 2')
直到循环完成。
const tick = Date.now();
const log = (v) => console.log(`${v} \n Elapsed: ${Date.now() - tick}ms`);
const notBlocked = () => {
return Promise.resolve().then(() => {
let i = 0;
while(i < 1000000000) { i++; } //runs asynchronically
return ' billion loops done';
})
}
log(' Synchronous 1');
notBlocked().then(log);
log(' Synchronous 2');
log('同步2') 被阻止了
const tick = Date.now();
const log = (v) => console.log(`${v} \n Elapsed: ${Date.now() - tick}ms`);
const notBlocked = async() => {
let i = 0;
while(i < 100000000) { i++; } //runs synchronically and blocks main thread
return ' billion loops done';
}
log(' Synchronous 1');
notBlocked().then(log);
log(' Synchronous 2');
async
的情况下使用await
,这是将Promise
->then
配对(以简化操作)的语法糖。由于代码片段按预期运行,因此不清楚您想要实现什么:第一个log
是同步的,首先运行;notBlocked
是异步的,被排队;第二个log
是同步的,其次运行。问题出在哪里?您需要了解事件循环的工作原理。 - Oleg Valter is with Ukraine