Wie erkenne ich, ob ein Objekt ein Versprechen ist?
Ob es ein ES6 Versprechen oder ein bluebird Versprechen, Q Versprechen, etc.
Wie kann ich testen, um zu sehen, ob ein bestimmtes Objekt ist ein Versprechen?
InformationsquelleAutor der Frage theram | 2015-01-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie ein Versprechen-Bibliothek entscheidet
Wenn es eine
.then
Funktion - das ist die nur standard Versprechen Bibliotheken verwenden.Der Promises/A+ - Spezifikation hat eine Vorstellung genannt
then
in der Lage, die im Grunde ist "ein Objekt mit einemthen
- Methode". Verspricht wird und soll assimilieren alles mit einer then-Methode. Alle Versprechen, die Umsetzung, die Sie erwähnt haben, die dies tun.Wenn wir uns die Spezifikation:
Er erklärt auch die Gründe für diese design-Entscheidung:
Wie sollten Sie sich entscheiden,
Sollten Sie nicht - rufen stattdessen
Promise.resolve(x)
(Q(x)
in Q), wird immer konvertieren Sie einen beliebigen Wert oder externethen
können, in einem vertrauenswürdigen Versprechen. Es ist sicherer und einfacher als die Durchführung dieser Prüfungen sich.wirklich brauchen, um sicher zu sein?
Können Sie immer führen Sie es durch die test-suite 😀
InformationsquelleAutor der Antwort Benjamin Gruenbaum
Prüfen, ob etwas Versprechen unnötig erschwert der code, verwenden Sie einfach
Promise.resolve
InformationsquelleAutor der Antwort Esailija
Hier meine ursprüngliche Antwort, die seitdem ratifiziert in der spec als die Möglichkeit zu testen, für ein Versprechen:
Dies funktioniert, da die Algorithmus ausdrücklich verlangt, dass
Promise.resolve
muss wieder das genaue Objekt übergeben, wenn und nur, wenn es ist ein Versprechen, das durch die Bestimmung des spec.Habe ich noch eine Antwort hier, das zu sagen, aber ich änderte es etwas anderes, wenn es nicht funktioniert mit Safari zu dieser Zeit. Das war vor einem Jahr, und diese funktioniert jetzt zuverlässig, auch in Safari.
Ich würde bearbeitet haben meine ursprüngliche Antwort, außer, dass gefühlt falsch, angesichts der Tatsache, dass Menschen, die jetzt dafür gestimmt haben, die veränderte Lösung in einer Antwort als das original. Ich glaube, das ist die bessere Antwort, und ich hoffe, Sie Stimmen zu.
InformationsquelleAutor der Antwort jib
Update: Dies ist nicht mehr die beste Antwort. Bitte Stimmen Sie bis meine andere Antwort statt.
sollte es tun. Beachten Sie, dass dies kann nur zuverlässig arbeiten mit nativen es6 verspricht.
Wenn Sie eine Unterlegscheibe, eine Verheißung, die Bibliothek oder etwas anderes vorgibt zu sein, Versprechen mag, dann ist es möglicherweise besser geeignet, um zu testen, für eine "thenable" (alles mit einem
.then
- Methode), wie in anderen Antworten hier.InformationsquelleAutor der Antwort jib
InformationsquelleAutor der Antwort unobf
Um zu sehen, ob das vorliegende Objekt ist ein native ES6 Versprechenwir können machen, verwenden Sie dieses Prädikat:
Call
ingtoString
direkt von derObject.prototype
gibt eine native string-Darstellung der gegebenen Objekttyp die"[object Promise]"
in unserem Fall. Dies gewährleistet, dass das ObjekttoString
- Methode des gegebenen Objektes.instanceof
oderisPrototypeOf
.InformationsquelleAutor der Antwort Boghyon Hoffmann
Hier ist der code-form https://github.com/ssnau/xkit/blob/master/util/is-promise.js
wenn ein Objekt mit einem
then
Methode, sollte es behandeln wie einPromise
.InformationsquelleAutor der Antwort ssnau
InformationsquelleAutor der Antwort purplecabbage
Falls Sie mit Typoskriptich möchte noch hinzufügen, dass Sie verwenden können, die "Typ-Prädikat" - Funktion. Nur sollten wickeln Sie das logische Prüfung in eine Funktion zurückgibt, die
x is Promise<any>
und Sie brauchen nicht zu tun, Typumwandlungen. Unten auf mein Beispielc
ist entweder ein Versprechen oder eine meiner Arten die ich konvertieren möchten, in der ein Versprechen durch den Aufruf derc.fetch()
Methode.Mehr info: https://www.typescriptlang.org/docs/handbook/advanced-types.html
InformationsquelleAutor der Antwort Murilo Perrone
Nicht eine Antwort auf die ganze Frage, aber ich denke, es lohnt sich zu erwähnen, dass in Node.js 10 eine neue util-Funktion aufgerufen
isPromise
wurde Hinzugefügt, die prüft, ob ein Objekt ist eine native Versprechen oder nicht:InformationsquelleAutor der Antwort LEQADA
bei der Suche nach einem zuverlässige Möglichkeit zu erkennen, Async Funktionen oder sogar Versprichtlandete ich mit folgenden test :
InformationsquelleAutor der Antwort Sebastien H.
ES6:
InformationsquelleAutor der Antwort Mathias Gheno Azzolini