为什么我的暂停等待到等待完成后,但我的日志却没有



如果我有类似的设置:

< - 语言:lang-javascript->

console.clear();
// noprotect
const fetchSomething = () => new Promise((resolve) => {
    setTimeout(() => resolve('future value'), 500);
});
async function asyncFunction() {
    const result = await fetchSomething();
    console.log('waiting');
    setTimeout(()=>console.log('waiting?'), 250);
    return result + ' 2';
}
asyncFunction().then(result => console.log(result));

我的输出看起来像:

"waiting"
"future value 2"
"waiting?"

我希望waiting?在结果完成之前执行,但由于某种原因,它会在功能上等待。是什么让一个等待,但另一个执行?

它是异步编程的功能。

您必须添加 await并使用一个函数包装setTimeout(()=>console.log('waiting?'), 250);,该功能返回承诺以使其看起来像连续评估。

类似:

await ((ms) =>{
        console.log('waiting?');
        return new Promise(resolve => setTimeout(resolve, ms));
    })(250);

或:

await (() => new Promise(resolve => setTimeout(()=>{
    console.log('waiting?');
    resolve();
}, 250)))();

请注意,JS有一个螺纹运行时引擎,因此当原始脚本到达结束时,它会中断评估。

setTimeout(function, timeout)中的功能是通过JS评估的,当它具有第一个机会和时间是正确的。

因此您的功能被中断了两次,并恢复了两次。

记录"等待"的调用?await完成后由setTimeout启动,因此fetchSomething中的500ms已经通过。fetchSomething返回后,它将仅执行250ms。这是asyncFunction返回的时间。

如果您想看到不同的行为,请启动计时器来记录"等待?"?在打电话之前等待:

async function asyncFunction() {
  setTimeout(()=>console.log('waiting?'), 250);
  const result = await fetchSomething();
  console.log('waiting');
  return result + ' 2';
}

最新更新