Dies ist ein kluger Versuch, Interoperabilität zwischen verschiedenen Bibliotheken zu erleichtern.
Die Spezifikation verwendet den Begriff thenable
nur an wenigen Stellen. Dieser ist der wichtigste (empasis von mir):
Das Versprechen Beilegungsverfahren ist eine abstrakte Operation als Eingabe nimmt ein Versprechen und einen Wert, die wir als [[Resolve]](promise, x)
bezeichnen. Wenn x ein anschließbares ist, versucht es Versprechen zu machen, den Zustand von x anzunehmen, unter der Annahme, dass sich x zumindest etwas wie ein Versprechen verhält. Ansonsten erfüllt es Versprechen mit dem Wert x.
Dies wird Implementierer auszukommen eine Überprüfung wie:
if (typeof(x.then) === 'function') {
// adopt the state of x
} else {
// fulfill promise with value x
}
Wenn stattdessen die spec sagte „wenn x ein Versprechen ist, dann ...“, wie die Implementierer wissen würde, ob x
ist ein Versprechen oder nicht? Es gibt keinen praktischen Weg, um sicherzustellen, dass x
die Promise-Spezifikation nur bei der Überprüfung erfüllt.
Ein Implementierer (sagen wir, Bibliothek FooPromises
könnte etwas tun, wie
if (x instanceof FooPromises.Promise) {
// adopt the state of x
} else {
// fulfill promise with value x
}
und es würde keine Versprechungen wirksam ablehnen aus verschiedenen Implementierungen kommen.
Stattdessen durch eine super-einfache Definition von thenable
Verwendung in Diese Bedingung, die die Implementierer leicht überprüfen können, ist trivial und macht es möglich, dass Implementierungen gut miteinander spielen.
Für Sie zweite Frage, ich bin nicht sicher, aber meine Idee wäre, dass eine Notation [[Resolve]](promise, x)
betont, dass es sich um eine abstrakte Operation ist. Wenn sie die Klammern fallen ließen und nur Resolve(promise, x)
sagten, würde das bedeuten, dass die Implementoren eine echte Funktion mit dem Namen Resolve
erstellen und sie offen legen sollten.
Dies ist nicht erforderlich - Resolve
ist nicht Teil der Versprechen 'Schnittstelle; Es ist nur ein Teil ihres Verhaltens, der wichtig genug war, dass es in den Dokumenten einen Namen und einen separaten Abschnitt erhielt.
also was ist der Unterschied zwischen dannable und Versprechen? Wie würdest du den Unterschied definieren? –
Wenn ich ein Objekt 'var foo = {'then': function() {alert (123)}};' mache, dann ist es ein Dannable, aber offensichtlich kein Versprechen. – Kos
Vielen Dank für Ihre Klarstellung. also ein tentable ist, was auch immer eine "then" -Funktion hat und ein Versprechen ist eine besondere Art von tableable, die der Spezifikation entspricht, soweit ich es verstehe. –