2016-08-16 15 views
13

Posiadałem asynchroniczną funkcję w JavaScript i dodałem do niej setTimeout. Kod wygląda następująco:Czy użycie asynchronizacji w metodzie setTimeout jest poprawne?

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

Pętla setTimeout ma dodać 2 sekundy zanim funkcja zostanie uruchomiona. Należy się upewnić, że użytkownik przestał pisać.

Czy powinienem teraz usunąć funkcję async/await z tej funkcji, skoro setTimeout jest tak czy inaczej asynchroniczny?

Każda pomoc tutaj bardzo doceniona!

+0

_ "Kod wygląda tak" _ Mało prawdopodobne, i dlatego nie powinieneś usuwać 'async' i' czekaj'. To nie ma sensu w tym przykładzie, ale to nie znaczy, że nie ma sensu w (realnym) kodzie. – zeroflagL

+1

Nie jest jasne, o co dokładnie pytasz. W jaki sposób działa kod **, który ** powinien działać i jak usunąć "async" i "oczekiwać" ** zmienić **? Bez wyraźnego pytania, które ma faktyczną * odpowiedź * na to, dostajesz bardzo szeroką i upartą radę. – noppa

+0

Mam edytowane pytanie, aby było jasne, co próbuję osiągnąć. – Marta

Odpowiedz

24

setTimeout dodaje opóźnienie przed wywołanie funkcji, natomiast async/await jest cukier syntaktyczny ontop obietnic, sposób na kod łańcucha uruchomić po wywołanie kończy, więc oni jest inny.

setTimeout ma straszliwe cechy obsługi błędów, więc polecam następujące we wszystkich kodu:

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

i nigdy potem zadzwonić setTimeout bezpośrednio ponownie.

Kod staje się teraz:

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

wyjątkiem foo czeka na doSomething aby zakończyć. Jest to zwykle pożądane, ale bez kontekstu trudno jest wiedzieć, czego się chce. Jeśli masz na myśli uruchomienie doSomething równolegle z innym kodem, polecam:

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

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

Jeśli naprawdę oznaczało ognia i zapomnieć _doSomething i nie czekać na niego, można stracić await, ale należy spróbować/błędy haczyk:

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

Ale nie zalecają wzór, jak jest subtelny i łatwo go przeoczyć.

-3
/* contrived example alert */ 
var foo = 'poo'; 
function setFoo(callback) (
    setTimeout(function(){ 
     foo = 'bar'; 
     callback(); 
    }, 100); 
); 
setFoo(function() { 
    alert(foo); 
}); 
+1

Widzę spadki, ale nie mam żadnych komentarzy, żeby wyjaśnić pochmurne ... Jak to w ogóle odpowiada na pytanie? A także nie używasz nawet funkcji 'async', o to pyta. – aug

Powiązane problemy