I think this can be solved with some inverse resolution logic, ie. a Deferred object that is resolved in response to a rejection and vice versa.
First a function to do the inversion :
function inverse_resolve(promise) {
var dfrd = $.Deferred();
promise.done(dfrd.reject).fail(dfrd.resolve);
return dfrd.promise();
}
Now, we can compose a fairly conventional when()
expression that responds normally to sba
, sbb
, sbc
, sbd
, sbe
but to the inverse state of sbf
and sbg
.
$.when(sba_dfd, sbb_dfd, sbc_dfd, sbd_dfd, sbe_dfd, inverse_resolve(sbf_dfd), inverse_resolve(sbg_dfd)).done(function() {
//do something
});
For clarity, I have left out .promise()
in each case. In practice, .promise()
isn't necessary as .when()
will respond to Deferreds in the same way it responds to promises.
As I say, I think this will work. It's completely untested.