Sto usando $.when
per concatenare alcuni oggetti rinviati, e se uno di loro fallisce, il metodo always
verrà chiamato direttamente dopo l'errore, anche se ho ancora qualche deferrer in uno stato "in sospeso".jquery posticipato - "sempre" chiamato al primo rigetto
var promises = [], defs = [];
for(var i=0 ; i < 10 ; i++){
defs.push($.Deferred());
promises.push(defs[i].promise());
}
var res = $.when.apply($, promises);
res.fail(function(){console.log('failed')});
res.done(function(){console.log('done')});
res.always(function(){console.log('always')});
res.then(function(){console.log('then, done')},
function(){console.log('then, failed')});
var j = 0;
var t = setInterval(function(){
if(j < 10){
if(j < 5) {
console.log('resolve');
defs[j++].resolve();
}
else {
console.log('reject');
defs[j++].reject();
}
}
else {
clearInterval(t);
}
}, 200);
Verificare this jsfiddle.
Forse è il comportamento normale. Ma, in questo caso, come posso prendere la fine della mia catena anche se alcuni di loro hanno fallito?
grazie @yury-tarabanko! Mi piace l'idea di estendere jQuery e aggiungere un metodo riutilizzabile per esaminare tutti i finali del deferrer, anche se falliscono. In base alla tua idea e alla sorgente "when" di jQuery, ho fatto di nuovo il "whenall", controlla la fonte se hai tempo http://jsfiddle.net/cSy2K/5/;) – zazabe