2016-08-16 1 views
13

Ich hatte eine asynchrone Funktion in Javascript und ich habe setTimeout hinzugefügt. Der Code sieht wie folgt aus:Verwendet async in setTimeout gültig?

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

Die puprose von setTimeout beträgt 2 Sekunden hinzufügen, bevor Funktion ausgeführt werden soll. Es ist sicher, dass der Benutzer die Eingabe beendet hat.

Sollte ich async/await jetzt von dieser Funktion entfernen, da setTimeout sowieso asynchron ist?

Jede Hilfe hier sehr geschätzt!

+0

_ "Der Code sieht so aus" _ Unwahrscheinlich, und deshalb sollten Sie 'async' und' await' nicht entfernen. Es ergibt keinen Sinn in diesem Beispiel, aber das bedeutet nicht, dass es im (echten) Code sinnlos ist. – zeroflagL

+1

Es ist ein bisschen unklar, was Sie hier genau fragen. Wie soll das Stück Code ** funktionieren und wie könnte das Entfernen von "Async" und "Warten" ** das ändern? Ohne eine klare Frage, die eine tatsächliche * Antwort * hat, erhalten Sie nur sehr breite und eigensinnige Ratschläge. – noppa

+0

Ich habe die Frage bearbeitet, um klarer zu machen, was ich versuche zu erreichen. – Marta

Antwort

24

setTimeout eine Verzögerung vor einen Funktionsaufruf fügt hinzu, während async/await syntaktischer Zucker ontop Versprechen ist, Code ein Weg zur Kette nach ein Aufruf abgeschlossen laufen, so dass sie‘ wieder anders.

SetTimeout hat schreckliche Fehler-Handhabungseigenschaften, so empfehle ich in jedem Code die folgenden:

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

und dann setTimeout nie wieder direkt aufrufen.

Ihr Code jetzt wird:

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

außer foo wartet doSomething zu beenden. Dies ist normalerweise wünschenswert, aber ohne Kontext ist es schwer zu wissen, was Sie wollen. Wenn Sie bedeuten doSomething parallel zu anderem Code auszuführen, empfehle ich:

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

beizutreten und Fehler an der gleichen Stelle zu erfassen.

Wenn Sie wirklich warten, bis es zu feuern und vergessen _doSomething und nicht dazu gedacht, können Sie die await verlieren, aber Sie sollten versuchen,/catch Fehler:

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

Aber ich glaube nicht, dass die Muster empfehlen, da es ist subtil und kann leicht zu übersehen sein.

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

Ich sehe Downvotes, aber keine Kommentare, um die Downvotes zu klären ... Wie beantwortet das überhaupt die Frage? Und Sie verwenden nicht einmal eine Async-Funktion, nach der diese Frage gefragt wird. – aug