如果我有这样的设置:
< - language: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?
在结果完成之前执行,但由于某种原因它会等待函数。是什么让一个人等待而另一个人执行?
答案 0 :(得分:0)
这是异步编程的一个特性。
您必须添加await
并使用返回Promise的函数包装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在第一次机会和时间合适时进行评估。
所以你的功能被中断了两次并且恢复了两次。
答案 1 :(得分:-1)
对日志的呼叫"等待?"在setTimeout
完成后由await
启动,因此fetchSomething
中的500毫秒已经过去了。它只会在fetchSomething
返回后执行250ms。这是asyncFunction
返回的足够时间。
如果您想看到不同的行为,请启动记录计时器"等待?"在致电等待之前:
async function asyncFunction() {
setTimeout(()=>console.log('waiting?'), 250);
const result = await fetchSomething();
console.log('waiting');
return result + ' 2';
}