- 1.0! 🍰
This is an intermediate release for projects transitioning to 1.0. This release is version 1.0 but includes many deprecation warnings to assist in migration to the new interface.
⚠️ As of1.0
, Q will require ECMAScript 5. Usinges5-shim
, nor evenes5-sham
, is not sufficient to make legacy engines compatible because Q requires a WeakMap shim that depends on ES5 properties. The0.9
version train will continue to support older browsers and will attempt to provide a forward-compatible feature set if you take care to eliminate all deprecation warnings before migrating.⚠️ Release management has changed. The source for this library isq.js
and is only suitable for consumption as a CommonJS, ergo Node.js, module. Releases are created usinggrunt
, includingrelease/q.js
, which is suitable for use as a<script>
, andrelease/amd/q.js
, which is suitable for use as an AMD module. All new versions will be published to S3.⚠️ Q now depends on an ASAP package and a WeakMap shim. If you are using an AMD loader, you will need to bring in https://github.com/kriskowal/asap and https://github.com/drses/weak-map. If you are using Q as a<script>
, this has been embedded in the release. If you are using Q in Node.js, the dependency is taken care of by NPM.⚠️ Withdrew support for SpiderMonkey style generators. Only ES6 generators are supported.⚠️ Q.all
no longer reuses the input array for the output array.⚠️ Q.all
andQ.allSettled
no longer accept a promise. UseQ(promise).all()
or.allSettled()
. The original behavior is deprecated.⚠️ valueOf
has been removed. Please useinspect().value
instead.⚠️ The promise protocol no longer supports "set", "delete", and "apply" operations. Function application is a special case of "post" with an undefined method name, and an additional "thisp" argument for support of "fbind". The "when" message is now called simply "then". As such, this version of Q is not compatible with Q-Connectionv0.5
.spread
now accepts an optionalprogressed
argument.- Promises now support vicious cycle detection. If a deferred promise ultimately depends upon its own resolution, it will be rejected with the singleton vicious cycle error.
Q now supports a Promise
constructor with two forms. new Promise(callback(resolve, reject))
and new Promise(promiseHandler)
.
Promise handlers are a new concept and will serve as the basis for
extensibility.
Added:
Promise
for constructing promises of all kindsPromise.cast
Removed. These have migration shims that simply throw errors.
Q.set
,promise.set
Q.delete
,promise.delete
Q.makePromise
in favor of the newPromise
constructor and promise handler.
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.master
is no longer neededQ.resolve
in favor ofQ
orPromise.cast
Q.fulfill
in favor ofQ
orPromise.cast
Q.isPromiseAlike
in favor ofQ.isThenable
Q.nearer
in favor ofpromise.inspect
Q.when
in favor ofQ().then
Q.fail
andpromise.fail
in favor ofpromise.catch
Q.fin
andpromise.fin
in favor ofpromise.finally
Q.mapply
andpromise.mapply
in favor ofpromise.post
Q.send
andpromise.send
in favor ofpromise.invoke
Q.mcall
andpromise.mcall
in favor ofpromise.invoke
Q.promise
in favor ofnew Q.Promise
with a functionQ.makePromise
in favor ofnew Q.Promise
with a handler objectpromise.fbind
in favor ofQ.fbind
deferred.makeNodeResolver()
in favor ofrequire("q/node").makeNodeResolver(deferred.resolve)
promise.passByCopy()
in favor ofQ.passByCopy(promise)
, provisionally
Node.js wrappers that have been moved into their own module have a
deprecated interface in Q proper. Notably, promise.nodeify
has been
retained as the only Node.js convenience method in Q and on the promise
prototype.
denodify
,nfbind
,nbind
,npost
,ninvoke
But the following experimental aliases are deprecated and do not exist
in q/node
:
nsend
forninvoke
nmcall
forninvoke
nmapply
fornpost
⚠️ q.min.js
is no longer checked-in. It is however still created by Grunt and NPM.- Fixes a bug that inhibited
Q.async
with implementations of the new ES6 generators. - Fixes a bug with
nextTick
affecting Safari 6.0.5 the first time a page loads when aniframe
is involved. - Introduces
passByCopy
,join
, andrace
. - Shows stack traces or error messages on the console, instead of
Error
objects. - Elimintates wrapper methods for improved performance.
Q.all
now propagates progress notifications of the form you might expect of ES6 iterations,{value, index}
where thevalue
is the progress notification from the promise atindex
.
- Fixes a bug in recognizing the difference between compatible Q promises, and Q promises from before the implementation of "inspect". The latter are now coerced.
- Fixes an infinite asynchronous coercion cycle introduced by former solution, in two independently sufficient ways. 1.) All promises returned by makePromise now implement "inspect", albeit a default that reports that the promise has an "unknown" state. 2.) The implementation of "then/when" is now in "then" instead of "when", so that the responsibility to "coerce" the given promise rests solely in the "when" method and the "then" method may assume that "this" is a promise of the right type.
- Refactors
nextTick
to use an unrolled microtask within Q regardless of how new ticks a requested. #316 @rkatic
- Introduces
inspect
for getting the state of a promise as{state: "fulfilled" | "rejected" | "pending", value | reason}
. - Introduces
allSettled
which produces an array of promises states for the input promises once they have all "settled". This is in accordance with a discussion on Promises/A+ that "settled" refers to a promise that is "fulfilled" or "rejected". "resolved" refers to a deferred promise that has been "resolved" to another promise, "sealing its fate" to the fate of the successor promise. - Long stack traces are now off by default. Set
Q.longStackSupport
to true to enable long stack traces. - Long stack traces can now follow the entire asynchronous history of a promise, not just a single jump.
- Introduces
spawn
for an immediately invoked asychronous generator. @jlongster - Support for experimental synonyms
mapply
,mcall
,nmapply
,nmcall
for method invocation.
isPromise
andisPromiseAlike
now always returns a boolean (even for falsy values). #284 @lfac-pt- Support for ES6 Generators in
async
#288 @andywingo - Clear duplicate promise rejections from dispatch methods #238 @SLaks
- Unhandled rejection API #296 @domenic
stopUnhandledRejectionTracking
,getUnhandledReasons
,resetUnhandledRejections
.
- Add the ability to give
Q.timeout
's errors a custom error message. #270 @jgrenon - Fix Q's call-stack busting behavior in Node.js 0.10, by switching from
process.nextTick
tosetImmediate
. #254 #259 - Fix Q's behavior when used with the Mocha test runner in the browser, since
Mocha introduces a fake
process
global without anextTick
property. #267 - Fix some, but not all, cases wherein Q would give false positives in its unhandled rejection detection (#252). A fix for other cases (#238) is hopefully coming soon.
- Made
Q.promise
throw early if given a non-function.
- Pass through progress notifications when using
timeout
. #229 @omares - Pass through progress notifications when using
delay
. - Fix
nbind
to actually bind thethisArg
. #232 @davidpadbury
- Made the AMD detection compatible with the RequireJS optimizer's
namespace
option. #225 @terinjokes - Fix side effects from
valueOf
, and thus fromisFulfilled
,isRejected
, andisPending
. #226 @benjamn
This release removes many layers of deprecated methods and brings Q closer to alignment with Mark Miller’s TC39 strawman for concurrency. At the same time, it fixes many bugs and adds a few features around error handling. Finally, it comes with an updated and comprehensive API Reference.
The following deprecated or undocumented methods have been removed. Their replacements are listed here:
0.8.x method | 0.9 replacement |
---|---|
Q.ref |
Q |
call , apply , bind (*) |
fcall /invoke , fapply /post , fbind |
ncall , napply (*) |
nfcall /ninvoke , nfapply /npost |
end |
done |
put |
set |
node |
nbind |
nend |
nodeify |
isResolved |
isPending |
deferred.node |
deferred.makeNodeResolver |
Method , sender |
dispatcher |
send |
dispatch |
view , viewInfo |
(none) |
(*) Use of thisp
is discouraged. For calling methods, use post
or
invoke
.
- Q now exports a
Q(value)
function, an alias forresolve
.Q.call
,Q.apply
, andQ.bind
were removed to make room for the same methods on the function prototype. invoke
has been aliased tosend
in all its forms.post
with no method name acts likefapply
.
- Long stack traces can be turned off by setting
Q.stackJumpLimit
to zero. In the future, this property will be used to fine tune how many stack jumps are retained in long stack traces; for now, anything nonzero is treated as one (since Q only tracks one stack jump at the moment, see #144). #168 - In Node.js, if there are unhandled rejections when the process exits, they are output to the console. #115
delete
andset
(néeput
) no longer have a fulfillment value.- Q promises are no longer frozen, which helps with performance.
thenReject
is now included, as a counterpart tothenResolve
.- The included browser
nextTick
shim is now faster. #195 @rkatic.
- Q now works in Internet Explorer 10. #186 @ForbesLindesay
fbind
no longer hard-binds the returned function'sthis
toundefined
. #202Q.reject
no longer leaks memory. #148npost
with no arguments now works. #207allResolved
now works with non-Q promises ("thenables"). #179keys
behavior is now correct even in browsers without nativeObject.keys
. #192 @rkaticisRejected
and theexception
property now work correctly if the rejection reason is falsy. #198
- The internal interface for a promise now uses
dispatchPromise(resolve, op, operands)
instead ofsendPromise(op, resolve, ...operands)
, which reduces the cases where Q needs to do argument slicing. - The internal protocol uses different operands. "put" is now "set". "del" is now "delete". "view" and "viewInfo" have been removed.
Q.fulfill
has been added. It is distinct fromQ.resolve
in that it does not pass promises through, nor coerces promises from other systems. The promise becomes the fulfillment value. This is only recommended for use when trying to fulfill a promise with an object that has athen
function that is at the same time not a promise.
- Treat foreign promises as unresolved in
Q.isFulfilled
; this letsQ.all
work on arrays containing foreign promises. #154 - Fix minor incompliances with the Promises/A+ spec and test suite. #157 #158
- Added
nfcall
,nfapply
, andnfbind
asthisp
-less versions ofncall
,napply
, andnbind
. The latter are now deprecated. #142 - Long stack traces no longer cause linearly-growing memory usage when chaining promises together. #111
- Inspecting
error.stack
in a rejection handler will now give a long stack trace. #103 - Fixed
Q.timeout
to clear its timeout handle when the promise is rejected; previously, it kept the event loop alive until the timeout period expired. #145 @dfilatov - Added
q/queue
module, which exports an infinite promise queue constructor.
- Added
done
as a replacement forend
, taking the usual fulfillment, rejection, and progress handlers. It's essentially equivalent tothen(f, r, p).end()
. - Added
Q.onerror
, a settable error trap that you can use to get full stack traces for uncaught errors. #94 - Added
thenResolve
as a shortcut for returning a constant value once a promise is fulfilled. #108 @ForbesLindesay - Various tweaks to progress notification, including propagation and transformation of progress values and only forwarding a single progress object.
- Renamed
nend
tonodeify
. It no longer returns an always-fulfilled promise when a Node callback is passed. deferred.resolve
anddeferred.reject
no longer (sometimes) returndeferred.promise
.- Fixed stack traces getting mangled if they hit
end
twice. #116 #121 @ef4 - Fixed
ninvoke
andnpost
to work on promises for objects with Node methods. #134 - Fixed accidental coercion of objects with nontrivial
valueOf
methods, likeDate
s, by the promise'svalueOf
method. #135 - Fixed
spread
not calling the passed rejection handler if given a rejected promise.
- Added
nend
- Added preliminary progress notification support, via
promise.then(onFulfilled, onRejected, onProgress)
,promise.progress(onProgress)
, anddeferred.notify(...progressData)
. - Made
put
anddel
return the object acted upon for easier chaining. #84 - Fixed coercion cycles with cooperating promises. #106
- Support Montage Require
- Fixed
npost
andninvoke
to pass the correctthisp
. #74 - Fixed various cases involving unorthodox rejection reasons. #73 #90 @ef4
- Fixed double-resolving of misbehaved custom promises. #75
- Sped up
Q.all
for arrays contain already-resolved promises or scalar values. @ForbesLindesay - Made stack trace filtering work when concatenating assets. #93 @ef4
- Added warnings for deprecated methods. @ForbesLindesay
- Added
.npmignore
file so that dependent packages get a slimmernode_modules
directory.
- Added preliminary support for long traces (@domenic)
- Added
fapply
,fcall
,fbind
for non-thisp promised function calls. - Added
return
for async generators, where generators are implemented. - Rejected promises now have an "exception" property. If an object isRejected(object), then object.valueOf().exception will be the wrapped error.
- Added Jasmine specifications
- Support Internet Explorers 7–9 (with multiple bug fixes @domenic)
- Support Firefox 12
- Support Safari 5.1.5
- Support Chrome 18
- WARNING:
promise.timeout
is now rejected with anError
object and the message now includes the duration of the timeout in miliseconds. This doesn't constitute (in my opinion) a backward-incompatibility since it is a change of an undocumented and unspecified public behavior, but if you happened to depend on the exception being a string, you will need to revise your code. - Added
deferred.makeNodeResolver()
to replace the more crypticdeferred.node()
method. - Added experimental
Q.promise(maker(resolve, reject))
to make a promise inside a callback, such that thrown exceptions in the callback are converted and the resolver and rejecter are arguments. This is a shorthand for making a deferred directly and inspired by @gozala’s stream constructor pattern and the Microsoft Windows Metro Promise constructor interface. - Added experimental
Q.begin()
that is intended to kick off chains of.then
so that each of these can be reordered without having to edit the new and former first step.
- Added
isFulfilled
,isRejected
, andisResolved
to the promise prototype. - Added
allResolved
for waiting for every promise to either be fulfilled or rejected, without propagating an error. @utvara #53 - Added
Q.bind
as a method to transform functions that return and throw into promise-returning functions. See an example. @domenic - Renamed
node
export tonbind
, and addednapply
to complete the set.node
remains as deprecated. @domenic #58 - Renamed
Method
export tosender
.Method
remains as deprecated and will be removed in the next major version since I expect it has very little usage. - Added browser console message indicating a live list of unhandled errors.
- Added support for
msSetImmediate
(IE10) orsetImmediate
(available via polyfill) as a browser-sidenextTick
implementation. #44 #50 #59 - Stopped using the event-queue dependency, which was in place for
Narwhal support: now directly using
process.nextTick
. - WARNING: EXPERIMENTAL: added
finally
alias forfin
,catch
alias forfail
,try
alias forcall
, anddelete
alias fordel
. These properties are enquoted in the library for cross-browser compatibility, but may be used as property names in modern engines.
- Deprecated
ref
in favor ofresolve
as recommended by @domenic. - Update event-queue dependency.
- Fixed Opera bug. #35 @cadorn
- Fixed
Q.all([])
#32 @domenic
- WARNING:
enqueue
removed. UsenextTick
instead. This is more consistent with NodeJS and (subjectively) more explicit and intuitive. - WARNING:
def
removed. Usemaster
instead. The termdef
was too confusing to new users. - WARNING:
spy
removed in favor offin
. - WARNING:
wait
removed. Doall(args).get(0)
instead. - WARNING:
join
removed. Doall(args).spread(callback)
instead. - WARNING: Removed the
Q
function module.exports alias forQ.ref
. It conflicts withQ.apply
in weird ways, making it uncallable. - Revised
delay
so that it accepts both(value, timeout)
and(timeout)
variations based on arguments length. - Added
ref().spread(cb(...args))
, a variant ofthen
that spreads an array across multiple arguments. Useful withall()
. - Added
defer().node()
Node callback generator. The callback accepts(error, value)
or(error, ...values)
. For multiple value arguments, the fulfillment value is an array, useful in conjunction withspread
. - Added
node
andncall
, both with the signature(fun, thisp_opt, ...args)
. The former is a decorator and the latter calls immediately.node
optional binds and partially applies.ncall
can bind and pass arguments.
- Fixed thenable promise assimilation.
- Stopped shimming
Array.prototype.reduce
. The enumerable property has bad side-effects. Libraries that depend on this (for example, QQ) will need to be revised.
- WARNING: Removed
report
andasap
- WARNING: The
callback
argument of thefin
function no longer receives any arguments. Thus, it can be used to call functions that should not receive arguments on resolution. Usewhen
,then
, orfail
if you need a value. - IMPORTANT: Fixed a bug in the use of
MessageChannel
fornextTick
. - Renamed
enqueue
tonextTick
. - Added experimental
view
andviewInfo
for creating views of promises either when or before they're fulfilled. - Shims are now externally applied so subsequent scripts or dependees can use them.
- Improved minification results.
- Improved readability.
- WARNING: In practice, the implementation of
spy
and the namefin
were useful. I've removed the oldfin
implementation and renamed/aliasedspy
. - The "q" module now exports its
ref
function as a "Q" constructor, with module systems that support exports assignment including NodeJS, RequireJS, and when used as a<script>
tag. Notably, strictly compliant CommonJS does not support this, but UncommonJS does. - Added
async
decorator for generators that use yield to "trampoline" promises. In engines that support generators (SpiderMonkey), this will greatly reduce the need for nested callbacks. - Made
when
chainable. - Made
all
chainable.
- Added
all
and refactoredjoin
andwait
to use it. All of these will now reject at the earliest rejection.
- Minor improvement to
spy
; now waits for resolution of callback promise.
- Made most Q API methods chainable on promise objects, and
turned the previous promise-methods of
join
,wait
, andreport
into Q API methods. - Added
apply
andcall
to the Q API, andapply
as a promise handler. - Added
fail
,fin
, andspy
to Q and the promise prototype for convenience when observing rejection, fulfillment and rejection, or just observing without affecting the resolution. - Renamed
def
(althoughdef
remains shimmed until the next major release) tomaster
. - Switched to using
MessageChannel
for next tick task enqueue in browsers that support it.
- Exceptions are no longer reported when consumed.
- Removed
error
from the API. Since exceptions are getting consumed, throwing them in an errback causes the exception to silently disappear. Useend
. - Added
end
as both an API method and a promise-chain ending method. It causes propagated rejections to be thrown, which allows Node to write stack traces and emituncaughtException
events, and browsers to likewise emitonerror
and log to the console. - Added
join
andwait
as promise chain functions, so you can wait for variadic promises, returning your own promise back, or join variadic promises, resolving with a callback that receives variadic fulfillment values.
end
no longer returns a promise. It is the end of the promise chain.- Stopped reporting thrown exceptions in
when
callbacks and errbacks. These must be explicitly reported through.end()
,.then(null, Q.error)
, or some other mechanism. - Added
report
as an API method, which can be used as an errback to report and propagate an error. - Added
report
as a promise-chain method, so an error can be reported if it passes such a gate.
- Fixed
<script>
support that regressed with 0.4.2 because of "use strict" in the module system multi-plexer.
- Added support for RequireJS (jburke)
- Added an "end" method to the promise prototype, as a shorthand for waiting for the promise to be resolved gracefully, and failing to do so, to dump an error message.
- *Removed the utility modules. NPM and Node no longer expose any module except the main module. These have been moved and merged into the "qq" package.
- *In a non-CommonJS browser, q.js can be used as a script. It now creates a Q global variable.
- Fixed thenable assimilation.
- Fixed some issues with asap, when it resolves to undefined, or throws an exception.
- The
post
method has been reverted to its original signature, as provided in Tyler Close'sref_send
API. That is,post
accepts two arguments, the second of which is an arbitrary object, but usually invocation arguments as anArray
. To provide variadic arguments topost
, there is a newinvoke
function that posts the variadic arguments to the value given in the first argument. - The
defined
method has been moved fromq
toq/util
since it gets no use in practice but is still theoretically useful. - The
Promise
constructor has been renamed tomakePromise
to be consistent with the convention that functions that do not require thenew
keyword to be used as constructors have camelCase names. - The
isResolved
function has been renamed toisFulfilled
. There is a newisResolved
function that indicates whether a value is not a promise or, if it is a promise, whether it has been either fulfilled or rejected. The code has been revised to reflect this nuance in terminology.
- Added
join
to"q/util"
for variadically joining multiple promises.
- The future-compatible
invoke
method has been added, to replacepost
, sincepost
will become backward- incompatible in the next major release. - Exceptions thrown in the callbacks of a
when
call are now emitted to Node's"uncaughtException"
process
event in addition to being returned as a rejection reason.
- Exceptions thrown in the callbacks of a
when
call are now consumed, warned, and transformed into rejections of the promise returned bywhen
.
- Fixed a minor bug in thenable assimilation, regressed because of the change in the forwarding protocol.
- Fixed behavior of "q/util"
deep
method on dates and other primitives. Github issue #11.
- Thenables (objects with a "then" method) are accepted and provided, bringing this implementation of Q into conformance with Promises/A, B, and D.
- Added
makePromise
, to replace thePromise
function eventually. - Rejections are now also duck-typed. A rejection is a promise with a valueOf method that returns a rejection descriptor. A rejection descriptor has a "promiseRejected" property equal to "true" and a "reason" property corresponding to the rejection reason.
- Altered the
makePromise
API such that thefallback
method no longer receives a superfluousresolved
method after theoperator
. The fallback method is responsible only for returning a resolution. This breaks an undocumented API, so third-party API's depending on the previous undocumented behavior may break.
- Changed promises into a duck-type such that multiple
instances of the Q module can exchange promise objects.
A promise is now defined as "an object that implements the
promiseSend(op, resolved, ...)
method andvalueOf
". - Exceptions in promises are now captured and returned as rejections.
- Fixed bug in
ref
that preventeddel
messages from being received (gozala) - Fixed a conflict with FireFox 4; constructor property is now read-only.
- Added
keys
message to promises and to the promise API.
- Added boilerplate to
q/queue
andq/util
. - Fixed missing dependency to
q/queue
.
- The
resolve
andreject
methods ofdefer
objects now return the resolution promise for convenience. - Added
q/util
, which providesstep
,delay
,shallow
,deep
, and three reduction orders. - Added
q/queue
module for a promiseQueue
. - Added
q-comm
to the list of compatible libraries. - Deprecated
defined
fromq
, with intent to move it toq/util
.
- Changed post(ref, name, args) to variadic post(ref, name, ...args). BACKWARD INCOMPATIBLE
- Added a def(value) method to annotate an object as being necessarily a local value that cannot be serialized, such that inter-process/worker/vat promise communication libraries will send messages to it, but never send it back.
- Added a send(value, op, ...args) method to the public API, for forwarding messages to a value or promise in a future turn.
- Added isRejected() for testing whether a value is a rejected promise. isResolved() retains the behavior of stating that rejected promises are not resolved.
- Fixed isResolved(null) and isResolved(undefined) [issue #9]
- Fixed a problem with the Object.create shim
- shimmed ES5 Object.create in addition to Object.freeze for compatibility on non-ES5 engines (gozala)
- Q.isResolved added
- promise.valueOf() now returns the value of resolved and near values
- asap retried
- promises are frozen when possible
- fixed dependency list for Teleport (gozala)
- all unit tests now pass (gozala)
- added support for Teleport as an engine (gozala)
- simplified and updated methods for getting internal print and enqueue functions universally (gozala)
- fixed erroneous link to the q module in package.json
- restructured for overlay style package compatibility
- removed asap because it was broken, probably down to the philosophy.
- removed q-util
- fixed asap so it returns a value if completed
- added q-util
- initial version