exports["test chained deferrence"] = function () { var async = function (n) { var defer = Q.defer(); Q.enqueue(function () { defer.resolve(n); }); return defer.promise; }; var x = Q.when(async(1), function (a) { return Q.when(async(2), function (b) { return a + b; }); }); var y; Q.when(x, function (x) { y = x; }); Q.enterEventLoop(function () { Q.shutdown(); }); assert.equal(y, 3); };
exports["test reentrant event loop"] = function () { Q.enterEventLoop(function () { Q.shutdown(); }); var ok; Q.enqueue(function () { ok = true; }); Q.enterEventLoop(function () { Q.shutdown(); }); assert.ok(ok); };
exports["test ref_send API when->resolve"] = function () { var deferred = Q.defer(); var promise = deferred.promise; var resolve = deferred.resolve; var ok, error; Q.when(promise, function (value) { ok = value; }, function (exception) { error = exception; }); resolve("result"); Q.enterEventLoop(function () { Q.shutdown(); }); assert.ok(ok); assert.ok(!error); };
exports["test NodeJS API"] = function () { var deferred = new Q.Deferred(); var result; deferred.addCallback(function (n) { result = n; }); /* or deferred.observe('ok', function (n) { result = n; }); */ deferred.emitSuccess(10); Q.enterEventLoop(function () { Q.shutdown(); }); assert.equal(result, 10); };
exports["test Dojo API"] = function () { var d = Q.Deferred(); Q.enqueue(function () { try { d.callback(true); } catch (e) { d.errback(new Error()); } }); var eventually; d.addCallback(function (value) { eventually = value; }); Q.enterEventLoop(function () { Q.shutdown(); }); assert.strictEqual(eventually, true); };
return function () { var chronicle = []; var print = function (message) { chronicle.push(message); }; var deferred = Q.defer(); setup = ({ "PromiseWhen": function () { Q.when(deferred.promise, function () { print('ok'); }, function () { print('error'); }, function (n) { print('progress ' + (n * 100).toFixed() + "%"); }); }, "DeferredWhen": function () { Q.when(deferred, function () { print('ok'); }, function () { print('error'); }, function (n) { print('progress ' + (n * 100).toFixed() + "%"); }); }, "PromiseObservers": function () { deferred.promise.observe('ok', function () { print('ok'); }); deferred.promise.observe('error', function () { print('error'); }); deferred.promise.observe('progress', function (n) { print('progress ' + (n * 100).toFixed() + '%'); }); }, "DeferredObservers": function () { deferred.observe('ok', function () { print('ok'); }); deferred.observe('error', function () { print('error'); }); deferred.observe('progress', function (n) { print('progress ' + (n * 100).toFixed() + '%'); }); }, "PromiseThen": function () { deferred.promise.then(function () { print('ok'); }, function () { print('error'); }, function (n) { print('progress ' + (n * 100).toFixed() + "%"); }); }, "DeferredThen": function () { deferred.then(function () { print('ok'); }, function () { print('error'); }, function (n) { print('progress ' + (n * 100).toFixed() + "%"); }); }, "Callback/Errback": function () { deferred.addCallback(function (value) { print('ok'); }).addErrback(function (value) { print('error'); }); // no analog, use observer deferred.observe("progress", function (n) { print('progress ' + (n * 100).toFixed() + "%"); }); }, "Both": function () { deferred.addBoth(function (value) { print('ok'); }, function (value) { print('error'); }); // no analog, use observer deferred.observe("progress", function (n) { print('progress ' + (n * 100).toFixed() + "%"); }); }, })[setup]; teardown = ({ "Resolve/Reject": function () { if (resolution == "ok") { deferred.resolve(); } else { deferred.reject(); } }, "Callback/Errback": function () { if (resolution == "ok") { deferred.callback(); } else { deferred.errback(); } } })[teardown]; order = ({ "Observe->Resolve": function () { setup(); teardown(); }, "Resolve->Observe": function () { teardown(); setup(); } })[order]; order(); Q.enterEventLoop(function () { Q.shutdown(); }); if (resolution == "ok") { assert.deepEqual(chronicle, [ 'ok', 'progress 100%' ]); } else { assert.deepEqual(chronicle, [ 'error', 'progress 0%' ]); } };