Closed. This question needs details or clarity。它当前不接受答案。
想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。
5个月前关闭。
Improve this question
如何使用 async / await语法在notBlocked()函数内的notBlocked()函数内转换notBlocked()或Promise.resolve()。then(),而不阻塞log('🥪Synchronous 2')?
运行第一个代码段,您将看到log('Synchronous 2')的持续时间是即时的,并且在控制台中的notBlocked()之前打印。
但是,如果您尝试在第二个代码段中使用带有notBlocked()函数的异步语法,则它将始终阻止“同步2”,因为花费的时间与notBlocked()相同。
与异步语法一起使用时,log('Synchronous 2')的持续时间始终与notBlocked()相同。
想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。
5个月前关闭。
Improve this question
如何使用 async / await语法在notBlocked()函数内的notBlocked()函数内转换notBlocked()或Promise.resolve()。then(),而不阻塞log('🥪Synchronous 2')?
运行第一个代码段,您将看到log('Synchronous 2')的持续时间是即时的,并且在控制台中的notBlocked()之前打印。
但是,如果您尝试在第二个代码段中使用带有notBlocked()函数的异步语法,则它将始终阻止“同步2”,因为花费的时间与notBlocked()相同。
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++; }
return '🐷 billion loops done';
})
}
log('🥪 Synchronous 1');
notBlocked().then(log);
log('🥪 Synchronous 2');
与异步语法一起使用时,log('Synchronous 2')的持续时间始终与notBlocked()相同。
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++; }
return '🐷 billion loops done';
}
log('🥪 Synchronous 1');
notBlocked().then(log);
log('🥪 Synchronous 2');
最佳答案
异步函数将同步运行,直到它们等待为止,因此,如果您的目标是使用异步函数将某些代码作为微任务延迟,则即使在等待无用的东西的情况下,也需要在其中等待。
const tick = Date.now();
const log = (v) => console.log(`${v} \n Elapsed: ${Date.now() - tick}ms`);
const notBlocked = async () => {
await undefined; // yield until the microtasks run
let i = 0;
while(i < 1000000000) { i++; }
return '🐷 billion loops done';
}
log('🥪 Synchronous 1');
notBlocked().then(log);
log('🥪 Synchronous 2');
09-18 03:29