Używam $.when
do połączenia niektórych obiektów odroczonych, a jeśli jeden z nich się nie powiedzie, metoda always
zostanie wywołana bezpośrednio po awarii, nawet jeśli nadal mam trochę odroczenia w stanie "oczekującym".jquery odroczone - "zawsze" wywoływane przy pierwszym odrzuceniu
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);
Sprawdź this jsfiddle.
Może to normalne zachowanie. Ale w tym przypadku, jak mogę złapać koniec mojego łańcucha, nawet jeśli niektóre z nich zawiodły?
dzięki @ yury-tarabanko! Podoba mi się pomysł rozszerzenia jQuery i dodania metody wielokrotnego użytku, aby spojrzeć na koniec odrocza, nawet jeśli się nie powiodło. Opierając się na twoim pomyśle i na "kiedy" źródło jQuery, ponownie zrobiłem "whenAll", sprawdź źródło, jeśli masz czas http://jsfiddle.net/cSy2K/5/;) – zazabe