-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
(v1.0) Implement a real user-facing promise constructor #346
Milestone
Comments
kriskowal
added a commit
that referenced
this issue
Oct 21, 2013
Implement the `Promise` constructor. The promise constructor serves both as a deferred promise constructor that accepts a function, and a new kind of promise constructor that accepts a backing handler object. The backing handler object must implement `dispatch(resolve, op, operands)` and `inspect()`. The new promise constructor replaces the `Q.promise` function, which is deprecated. The new promise constructor replaces `makePromise`, which has been removed entirely. As such, Q-Connection will have to be rearchitected to provide a custom promise handler for remote objects instead of using `makePromise`. Fixes #346. Postpone calling `then` on a thenable until a message is dispatched to the coerced promise. Fixes #372. When coercing a thenable, memoize the resulting promise to avoid re-starting a lazy promise. Add support for vicious cycle detection. Fixes #223. This change request also reviews the Q API, deprecating many interfaces that remain from legacy designs. Fixes #215. Factor most Node.js tools into `q/node` module. Mirror deprecated interfaces in Q. Support for `close` and `closed` has been removed from `Queue`, which has additional ramifications for Q-Connection. I intend to use Q-IO streams in Q-Connection instead of raw queues. Most of the Q specifications continue to work after these changes, but with many deprecation warnings. The specs have been revised to appease the deprecation warnings. :warning: However, the specifications for "progress" have all been disabled pending a closer investigation to decide whether to fix Q or fix the specs. The promise protocol no longer supports "set" and "delete" operations. Function application is a special case of "post", and for support of "fbind", it is now possible to pass a "thisp" as a final argument. The "when" message is now called simply "then". Support for pre-ECMAScript 5 has been abandoned outright, pending review. Removed: - Q.set, promise.set - Q.delete, promise.delete - Q.nearer - Q.master The following methods of `Q` are deprecated in favor of their equivalents on the `promise` prototype: - `progress`, `thenResolve`, `thenReject`, `isPending`, `isFulfilled`, `isRejected`, `dispatch`, `get`, `post`, `invoke`, `keys` Other deprecations: - Q.resolve in favor of Q - Q.fulfill in favor of Q - Q.isPromiseAlike in favor of Q.isThenable - Q.when in favor of Q().then - Q.fail and promise.fail in favor of promise.catch - Q.fin and promise.fin in favor of promise.finally - Q.mapply and promise.mapply in favor of promise.post - Q.send and promise.send in favor of promise.invoke - Q.mcall and promise.mcall in favor of promise.invoke - Q.promise in favor of new Q.Promise with a resolver function - Q.makePromise in favor of new Q.Promise with a handler object - promise.fbind in favor of Q.fbind - deferred.makeNodeResolver() in favor of require("q/node").makeNodeResolver(deferred.resolve) - promise.passByCopy() in favor of Q.passByCopy(promise), provisionally Node.js wrappers that have been moved into their own module have a deprecated interface in Q proper: - `nodeify`, `denodify`, `nfbind`, `nbind`, `npost`, `ninvoke` But the following experimental aliases are deprecated and do not exist in `q/node`: - `nsend` for `ninvoke` - `nmcall` for `ninvoke` - `nmapply` for `npost`
kriskowal
added a commit
that referenced
this issue
Oct 30, 2013
Implement the `Promise` constructor. The promise constructor serves both as a deferred promise constructor that accepts a function, and a new kind of promise constructor that accepts a backing handler object. The backing handler object must implement `dispatch(resolve, op, operands)` and `inspect()`. The new promise constructor replaces the `Q.promise` function, which is deprecated. The new promise constructor replaces `makePromise`, which has been removed entirely. As such, Q-Connection will have to be rearchitected to provide a custom promise handler for remote objects instead of using `makePromise`. Fixes #346. Postpone calling `then` on a thenable until a message is dispatched to the coerced promise. Fixes #372. Fixes #369. When coercing a thenable, memoize the resulting promise to avoid re-starting a lazy promise. Add support for vicious cycle detection. Fixes #223. This change request also reviews the Q API, deprecating many interfaces that remain from legacy designs. Fixes #215. Factor most Node.js tools into `q/node` module. Mirror deprecated interfaces in Q. Support for `close` and `closed` has been removed from `Queue`, which has additional ramifications for Q-Connection. I intend to use Q-IO streams in Q-Connection instead of raw queues. Most of the Q specifications continue to work after these changes, but with many deprecation warnings. The specs have been revised to appease the deprecation warnings. :warning: However, the specifications for "progress" have all been disabled pending a closer investigation to decide whether to fix Q or fix the specs. The promise protocol no longer supports "set" and "delete" operations. Function application is a special case of "post", and for support of "fbind", it is now possible to pass a "thisp" as a final argument. The "when" message is now called simply "then". Support for pre-ECMAScript 5 has been abandoned outright, pending review. Removed: - Q.set, promise.set - Q.delete, promise.delete - Q.nearer - Q.master The following methods of `Q` are deprecated in favor of their equivalents on the `promise` prototype: - `progress`, `thenResolve`, `thenReject`, `isPending`, `isFulfilled`, `isRejected`, `dispatch`, `get`, `post`, `invoke`, `keys` Other deprecations: - Q.resolve in favor of Q - Q.fulfill in favor of Q - Q.isPromiseAlike in favor of Q.isThenable - Q.when in favor of Q().then - Q.fail and promise.fail in favor of promise.catch - Q.fin and promise.fin in favor of promise.finally - Q.mapply and promise.mapply in favor of promise.post - Q.send and promise.send in favor of promise.invoke - Q.mcall and promise.mcall in favor of promise.invoke - Q.promise in favor of new Q.Promise with a resolver function - Q.makePromise in favor of new Q.Promise with a handler object - promise.fbind in favor of Q.fbind - deferred.makeNodeResolver() in favor of require("q/node").makeNodeResolver(deferred.resolve) - promise.passByCopy() in favor of Q.passByCopy(promise), provisionally Node.js wrappers that have been moved into their own module have a deprecated interface in Q proper: - `nodeify`, `denodify`, `nfbind`, `nbind`, `npost`, `ninvoke` But the following experimental aliases are deprecated and do not exist in `q/node`: - `nsend` for `ninvoke` - `nmcall` for `ninvoke` - `nmapply` for `npost`
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
It should basically be promises-aplus/constructor-spec#18. We already have most of this in
Q.promise
, but the important property we're missing is to be able to access this constructor viaanyPromiseInstance.constructor
.I want this a lot because then I could make this reusable with any promise library, by having it infer how to create promises via
operation.constructor
instead of hard-coding in Q.when, RSVP, and many others already have this.
Once this is implemented we should probably deprecate
Q.promise
in favor ofQ.Promise
.The text was updated successfully, but these errors were encountered: