can-reflect-promise
Expose an observable, Map-like API on Promise types.
canReflectPromise(promise)
If promise is an instance of a Promise type (either provided natively by the platform or by a polyfill library), the prototype
of the Promise type is decorated with can-symbol symbols for @@can.onKeyValue, @@can.offKeyValue,
@@can.getKeyValue, @@can.onValue, and @@can.offValue, which allow it to be used like an observable Map-like in
reflection.
Then promise and all future instances of promise.constructor will be initialized on first access to have the following keys
available through @@can.getKeyValue:
- "state" -- one of "pending", "resolved", or "rejected"
- "isPending" -- true if the promise neither resolved nor rejected, false otherwise.
- "isResolved" -- true if the promise is resolved, false otherwise.
- "isRejected" -- true if the promise is rejected, false otherwise.
- "value" -- the resolved value of the promise if resolved, otherwise undefined.
- "reason" -- the rejected value of the promise if rejected, otherwise undefined.
Note that, due to native Promises' lack of inspection, it is impossible to tell whether a Promise is resolved or rejected without using
.then(). If the Promise is Promises/A+ compliant, then at the time the Promise is initialized bycan-reflect-promise,isPendingwill always be true, even if the Promise has already resolved, and will remain so during synchronous execution. On the next tick, the state will update toresolved/rejectedif the Promise has already updated its state. The best strategy for ensuring a proper read of a resolved value or rejected reason is to listen for the change in state or value with @@can.onKeyValue immediately after creating a Promise.
In the cases where promise is a plain object (e.g. if it is a jQuery.Deferred), the symbols will be applied to promise
itself, not to the proto.
var p = new Promise(function(resolve) {
setTimeout(resolve.bind(null, "a"), 10);
});
canReflectPromise(p);
canReflect.getKeyValue(p, "isPending"); // -> true
setTimeout(function() {
canReflect.getKeyValue(p, "isResolved"); // -> true
canReflect.getKeyValue(p, "value"); // -> "a"
}, 20);
Parameters
- promise
{Promise}:any Promise, Promise-like, or thenable.