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!
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ć.
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);
});
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