在setTimeout中使用async有效吗?

Mar*_*rta 16 javascript asynchronous settimeout ecmascript-2017

我在Javascript中有一个异步函数,我添加了setTimeout.代码看起来像这样:

        let timer;
        clearTimeout(timer);
        timer =setTimeout(() => {
        (async() => {
            await this._doSomething();
        })();
        }, 2000);
Run Code Online (Sandbox Code Playgroud)

setTimeout的puprose是在运行函数之前加2秒.确保用户停止输入.

我现在应该从此函数中删除async/await,因为setTimeout是异步的吗?

任何帮助在这里非常感谢!

jib*_*jib 37

setTimeout函数调用之前添加一个延迟,而async/ await是在promises上的语法糖,一种调用完成链代码运行的方法,所以它们是不同的.

setTimeout具有可怕的错误处理特性,因此我建议在所有代码中使用以下内容:

let wait = ms => new Promise(resolve => setTimeout(resolve, ms));
Run Code Online (Sandbox Code Playgroud)

然后再也不要setTimeout直接打电话了.

您的代码现在变为:

let foo = async () => {
  await wait(2000);
  await this._doSomething();
}
Run Code Online (Sandbox Code Playgroud)

除了foo等待doSomething完成.这通常是可取的,但没有上下文,很难知道你想要什么.如果您打算doSomething与其他代码并行运行,我建议:

async () => { await Promise.all([foo(), this._otherCode()]); };
Run Code Online (Sandbox Code Playgroud)

在同一个地方加入和捕获错误.

如果你真的打算忘记_doSomething而不是等待它,你可能会失败await,但你应该尝试/捕获错误:

async () => {
  let spinoff = async () => { try { await foo(); } catch (e) { console.log(e); } };
  spinoff(); // no await!
}
Run Code Online (Sandbox Code Playgroud)

但我不推荐这种模式,因为它很微妙,很容易错过.