Wie man nicht vergisst, überall in Javascript zu warten?

8

Beim Versuch, eine kleine Chrome-Erweiterung zu schreiben, die auf den Callback-lastigen Abfragefunktionen der chrome.* -Schnittstelle beruht, landete ich schnell bei Versprechungen und async / warte ab, da ich beim Versuch die Reihenfolge bestimmter Operationen garantieren musste um die Rückruf-Hölle zu vermeiden.

Nachdem ich jedoch async / await in einige Funktionen eingeführt hatte, musste jede Funktion, die sie verwendete, ebenfalls in async function umgewandelt werden, damit await der Rückgabewert sein konnte. Schließlich wurden sogar einige globale Konstanten Versprechen, z.

%Vor%

Aber jetzt muss ich await überall schreiben und seltsame Fehler wie if(DEBUG){...} , die immer ausgeführt werden, einzuführen, wird viel zu einfach.

Während es scheint möglich, die Fehler mit ESLINT zu identifizieren , scheint das Schreiben von await überall unnötig schwerfällig und daher habe ich mich gefragt wenn Javascript ein besseres Konstrukt hat, das ich vermisse?

(Subjektiv scheint mein aktueller Gebrauch von hazard / async rückwärts zu sein; Versprechen werden unverändert beibehalten, es sei denn, es wird ausdrücklich erwartet, aber es erscheint mir erstrebenswerter, in asynchronen Funktionen standardmäßig zu warten und nur auf ausdrücklichen Wunsch als Versprechen gehalten zu werden .)

    
kdb 01.08.2017, 21:39
quelle

1 Antwort

4

Für den Fall, dass es kein Typsystem gibt, das es ermöglicht, solche Fehler leicht zu finden (haben Sie Typoskript oder Flow berücksichtigt?), können Sie Ungarische Notation für Systeme für Ihre Variablennamen. Wählen Sie ein Präfix des Suffixes wie P , Promise oder $ und fügen Sie es allen Ihren Versprechensvariablen hinzu, ähnlich wie asynchrone Funktionen oft mit einem Async Suffix benannt werden. Dann mach nur Dinge wie

%Vor%

Hier können Sie schnell sehen, dass if (debug) in Ordnung ist, if (debugPromise) jedoch nicht.

  

Nachdem ich async / await in einige Funktionen eingeführt hatte, musste jede Funktion, die sie verwendete, in eine asynchrone Funktion umgewandelt werden, um den Rückgabewert abwarten zu können. Schließlich wurden sogar einige globale Konstanten zu Versprechen.

Ich würde das nicht tun. Versuchen Sie, so wenig Funktionen asynchron wie möglich zu machen. Wenn sie nicht an sich asynchrone Dinge selbst tun, sondern sich nur auf die Ergebnisse einiger Versprechen verlassen, deklarieren Sie diese Ergebnisse als Parameter der Funktion. Ein einfaches Beispiel:

%Vor%

%Vor%

Das gleiche Muster kann für globale Variablen angewendet werden - entweder als explizite Parameter für jede Funktion oder als Parameter einer Modulfunktion, die alle anderen als Closures enthält. Dann verspricht await das globale Versprechen nur einmal im Modul, bevor etwas anderes deklariert oder ausgeführt wird, und verwenden Sie anschließend den einfachen Ergebniswert.

%Vor%

%Vor%     
Bergi 01.08.2017 21:54
quelle