javascript - jQuery.when - Callback for when ALL Deferreds are no longer 'unresolved' (either resolved or rejected)? -
when multiple deferred objects passed jquery.when, method returns promise new "master" deferred object tracks aggregate state of deferreds has been passed.
the method either
- resolve master deferred deferreds resolve, or
- reject master deferred 1 of deferreds rejected.
if master deferred resolved (ie. deferreds resolve), passed resolved values of deferreds passed jquery.when. example, when deferreds jquery.ajax() requests, arguments jqxhr objects requests, in order given in argument list:
$.when( $.getjson('foo'), $.getjson('bar') ).done(function(foo, bar) { // foo & bar jqxhr objects requests });
in multiple deferreds case 1 of deferreds rejected, jquery.when fires fail callbacks master deferred, if of deferreds may still unresolved @ point:
$.when( $.getjson('foo'), $.getjson('bar') ).fail(function(req) { // req jqxhr object 1 of failed requests });
i need fire callback when deferreds passed jquery.when no longer 'unresolved' (ie. either 'resolved' or 'rejected'). send json objects 200 ok codes (instead sending json 404 not found error status codes) , determine success/error in done() method, i'd prefer keeping api restful. how can accomplish this?
i think easiest way keep secondary deferred
object around each ajax request, , ensure that 1 resolved:
var d1 = $.deferred(); var d2 = $.deferred(); var j1 = $.getjson(...).complete(d1.resolve); var j2 = $.getjson(...).complete(d2.resolve); $.when(j1, j2).done( fires if j1 , j2 resolved ); $.when(d1, d2).done(function() { // fire when j1 , j2 both resolved or rejected // check j1.isresolved() , j2.isresolved() find failed });
this making use of additional ajax .complete()
method jquery adds promises ajax methods, called both resolved , rejected promises.
nb: d1.resolve
works callback in own right, doesn't need wrapped in function() { ... }
block.
Comments
Post a Comment