为什么我的超时要等到等待完成但我的日志没有?

时间:2017-02-25 23:12:22

标签: javascript asynchronous ecmascript-6 es6-promise

如果我有这样的设置:

< - 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?在结果完成之前执行,但由于某种原因它会等待函数。是什么让一个人等待而另一个人执行?

2 个答案:

答案 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';
}