Czy używanie async w setTimeout jest poprawne?

Miałem funkcję asynchroniczną w Javascript i dodałem do niej setTimeout. Kod wygląda tak:

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

Puprose setTimeout polega na dodaniu 2 sekund przed uruchomieniem funkcji. Ma to na celu upewnienie się, że użytkownik przestał pisać.

Czy powinienem teraz usunąć asynchroniczne / oczekujące z tej funkcji, ponieważ setTimeout i tak jest asynchroniczny?

Każda pomoc tutaj bardzo mile widziana!

Author: Felix Kling, 2016-08-16

2 answers

setTimeout dodaje opóźnienie przed wywołanie funkcji, natomiast async/await czy składniowy cukier na szczycie obietnic, sposób na łańcuch kodu, aby uruchomić po połączenie się kończy, więc są inne.

SetTimeout ma straszną charakterystykę obsługi błędów, więc polecam następujący kod w całym kodzie:

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

I nigdy więcej nie dzwoń bezpośrednio setTimeout.

Twój kod teraz staje się:

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

Z wyjątkiem foo czeka na doSomething, aby zakończyć. Zazwyczaj jest to pożądane, ale bez kontekstu trudno jest wiedzieć, czego chcesz. Jeśli chcesz uruchomić doSomething równolegle z innym kodem, polecam:

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

Aby dołączyć i wychwycić błędy w tym samym miejscu.

Jeśli naprawdę chciałeś odpalić i zapomnieć _doSomething i nie czekać na to, możesz stracić await, ale powinieneś spróbować / złapać błędy: {]}

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

Ale nie polecam tego wzoru, ponieważ jest subtelny i łatwo go przegapić.

 32
Author: jib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-18 20:58:55
/* contrived example alert */
var foo = 'poo';
function setFoo(callback) (
    setTimeout(function(){
        foo = 'bar';
        callback();
    }, 100);
);
setFoo(function() {
    alert(foo);
});
 -4
Author: satwick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-11 08:29:22