如果我有类似的设置:
< - 语言: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';
}