Skip to content

Instantly share code, notes, and snippets.

@theduderog
Last active December 19, 2015 15:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save theduderog/5980337 to your computer and use it in GitHub Desktop.
Save theduderog/5980337 to your computer and use it in GitHub Desktop.
Q does not resolve callbacks until next round of setImmediate()
var q = require('q')
, assert = require('assert')
, dOrigin = q.defer()
, dDependent = q.defer() //this one gets resolved by callbacks from dOrigin
, dDependent2 = q.defer() //this one gets resolved by linking directly to dOrigin
;
//Link to dOrigin by registering callbacks
dOrigin.promise.then(
function (result) {
dDependent.fulfill(result);
},
function (err) {
dDependent.reject(err);
}
);
//Link directly to dOrigin using resolve() method
dDependent2.resolve(dOrigin);
//Resolve dOrigin
dOrigin.resolve('DONE');
assert.ok(dOrigin.promise.isFulfilled(), 'Origin promise is fulfilled');
assert.ok(dDependent.promise.isPending(), 'Dependent promise is still pending but should be fulfilled');
assert.ok(dDependent2.promise.isFulfilled(), 'Dependent2 promise is fulfilled');
//dDependent gets resolved on the next round of setImmediate()
// NOTE: this is not true for nextTick()
var ticks = 0;
function checkFulfilled () {
ticks += 1;
// console.log(ticks + " tick(s)");
if (dDependent.promise.isFulfilled()) {
console.log("It's done! in " + ticks + " ticks");
}
else {
setImmediate(checkFulfilled);
}
};
setImmediate(checkFulfilled);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment