web-dev-qa-db-ja.com

setTimeoutで非同期を使用することは有効ですか?

Javascriptに非同期関数があり、それにsetTimeoutを追加しました。コードは次のようになります。

        let timer;
        clearTimeout(timer);
        timer =setTimeout(() => {
        (async() => {
            await this._doSomething();
        })();
        }, 2000);

SetTimeoutの目的は、関数が実行される前に2秒を追加することです。ユーザーが入力を停止したことを確認することです。

とにかくsetTimeoutは非同期なので、この関数からasync/awaitを削除する必要がありますか?

16
Marta

setTimeoutは遅延を追加しますbefore関数呼び出しに対して、async/awaitはpromiseの上にある構文糖衣です。実行するコードをチェーンする方法after呼び出しが完了するので、再異なる。

setTimeoutにはひどいエラー処理特性があるため、すべてのコードで次のことをお勧めします。

let wait = ms => new Promise(resolve => setTimeout(resolve, ms));

そして、再びsetTimeoutを直接呼び出さないでください。

コードは次のようになります。

let foo = async () => {
  await wait(2000);
  await this._doSomething();
}

foodoSomethingの終了を待つことを除きます。これは通常望ましいことですが、コンテキストがなければ、何が欲しいのかを知るのは困難です。 doSomethingを他のコードと並行して実行したい場合、以下をお勧めします。

async () => { await Promise.all([foo(), this._otherCode()]); };

同じ場所でエラーを結合してキャプチャします。

本当に発射して忘れるつもりだった場合は_doSomethingそしてそれを待たずに、awaitを失う可能性がありますが、エラーを試す/キャッチする必要があります:

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

しかし、そのパターンは微妙で見逃しやすいのでお勧めしません。

37
jib