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()相同。

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