19

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

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

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

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

4

2 に答える 2

48

setTimeout/ は関数呼び出しの前に遅延を追加しますが、 async/awaitは約束の上にある構文糖衣であり、呼び出しが完了した後に実行するコードをチェーンする方法であるため、それらは異なります。

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

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

setTimeout二度と直接電話しないでください。

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

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

終了するまでfoo待機しdoSomethingます。これは通常は望ましいことですが、コンテキストがなければ、何を望んでいるのかを知るのは困難です。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!
}

ただし、そのパターンは微妙で見落としやすいため、お勧めしません。

于 2016-08-18T20:42:47.497 に答える