Skip to content
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

Rearchitect Q for closure avoidance and WeakMap #415

Merged
merged 1 commit into from
Oct 30, 2013
Merged

Conversation

kriskowal
Copy link
Owner

⚠️ Submitted against modular branch, not master.

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.

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.

⚠️ 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
Copy link
Owner Author

See #416 for benchmark

@kriskowal
Copy link
Owner Author

Needs a note that this also addresses #369

@kriskowal
Copy link
Owner Author

And also, since it addresses #369, obviates #372

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`
@kriskowal kriskowal merged commit bbc7db1 into modular Oct 30, 2013
@kriskowal kriskowal deleted the rearch branch December 4, 2013 20:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

1 participant