javascript - when.all() 2.2.1 in cujojs doesn't reject if one deferred rejected -
i having trouble working out why promise being fulfilled when documentation says should rejected.
open http://jsbin.com/orifok/5/edit , click go button, , alerts "ok" when should alert "fail".
replace when221.all...
deferred2.promise.then(stepfulfilled, steprejected);
, rejection occurs.
i did make modification when.js code make when221 variable global, rather needing dependency upon require.js library (see http://pastebin.com/j8wcqjwm compared original https://github.com/cujojs/when/blob/2.2.1/when.js).
when.all() documentatation says: if of promises rejected, returned promise rejected rejection reason of first promise rejected - see https://github.com/cujojs/when/blob/master/docs/api.md#whenall
tl;dr: when.all must passed promise, not deferred, , programmer needs careful not make mistake.
brian cavalier answered here: https://github.com/cujojs/when/issues/172 , modified code here: http://jsbin.com/orifok/10/edit
the answer follows:
hi, example code passes deferred objects when.all. deferred objects not promises. unfortunately, libraries, such jquery, , admittedly, earlier versions of when.js, conflate promises , deferred objects. try clarify, i've started referring deferred objects pair {resolver, promise}. should pass promises, not deferred objects, when.all.
here's revised version of example work expect:
(function(){ var deferred1 = when221.defer(); var deferred2 = when221.defer(); window.clickgo = function() { // pass promise, not deferred when221.all([deferred1.promise, deferred2.promise]).then(stepfulfilled, steprejected); deferred2.reject('foooo'); }; function stepfulfilled() { alert('ok'); } function steprejected(failed) { alert('failed ' + failed); } })();
note when,js >= 2.2.0 has new, lighter weight promise creation api when.promise, i've started recommending on when.defer. suited different situations, i've found prefer of time.
hope helps!
Comments
Post a Comment