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,
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?
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.
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.
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.
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.
So können Sie Ihre Funktion zum Erteilen von Bestellungen implementieren
%Vor%Sie könnten diese Funktion wie
aufrufen %Vor%Tags und Links javascript promise