Wie würde man asynchrone JavaScript Getter und Setter machen?

9

Denken Sie daran, wie Schienen, z.B. ermöglicht es Ihnen, eine Eigenschaft als einer anderen zuzuordnen:

%Vor%

Dies erstellt keine Datenbankspalte für orders . Stattdessen wird ein Getter für orders erstellt, was uns ermöglicht,

zu machen %Vor%

Was geht und ruft die verwandten orders Objekte.

In JS können wir das einfach mit getters machen:

%Vor%

Aber Rails ist sync , und in JS, wenn wir in unserem Beispiel vernünftigerweise zur Datenbank gehen, würden wir es asynchron machen.

Wie würden wir asynchrone Getter (und Setter) erstellen?

Würden wir ein Versprechen zurückgeben, das eventuell gelöst wird?

%Vor%

was uns erlauben würde,

zu machen %Vor%

Oder würden wir es eckiger machen, wo wir es automatisch in einen Wert auflösen würden?

Zusammenfassend, wie implementieren wir asynchrone Getter?

    
deitch 01.03.2015, 06:16
quelle

2 Antworten

3

Die Schlüsselwörter get und set funktionieren anscheinend nicht mit dem Schlüsselwort async . Da async / await jedoch nur ein Wrapper um Promise s ist, können Sie einfach mit Promise die Funktionen " await -able" erstellen.

Hinweis: Es sollte möglich sein, die Object.defineProperty -Methode zu verwenden, um einem Setzer oder Getter eine async -Funktion zuzuordnen.

Getter

Versprechen funktionieren gut mit Gettern.

Hier verwende ich die eingebaute Funktion util.promisify() von Node.js 8, die einen Knoten-Stil-Callback ("nodeback") in ein Promise in einer einzelnen Zeile konvertiert. Dies macht es sehr einfach, einen await -fähigen Getter zu schreiben.

%Vor%

Setzer

Für Setter wird es ein bisschen komisch.

Sie können natürlich einem Verleiher ein Versprechen als Argument übergeben und alles tun, was darin ist, ob Sie darauf warten, dass das Versprechen erfüllt wird oder nicht.

Ich stelle mir jedoch vor, dass ein nützlicherer Anwendungsfall (der, der mich hierher gebracht hat!) wäre, den Setzer zu verwenden und dann await in dem Fall, in dem der Setzer verwendet wurde, zu vervollständigen. Dies ist leider nicht möglich, da der Rückgabewert der Setter-Funktion verworfen wird.

%Vor%

In diesem Beispiel wird Done! nach 1 second in die Konsole gedruckt und% Foo danach in 2 gedruckt. Dies liegt daran, dass await darauf wartet, dass promisedValue erfüllt ist, und nie die Promise , die im Setter verwendet / generiert wird.

    
Cameron Tacklind 15.06.2017 22:46
quelle
-2

So können Sie Ihre Funktion zum Erteilen von Bestellungen implementieren

%Vor%

Sie könnten diese Funktion wie

aufrufen %Vor%     
user5383152 13.04.2016 05:17
quelle

Tags und Links