Я использую $.when, чтобы связать некоторые объекты с отсрочкой, и если один из них терпит неудачу, метод always будет вызван непосредственно после отказа, даже если у меня все еще есть некоторый отсрочка в состоянии ожидания.
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); 
Отметьте этот jsfiddle.
Возможно, это нормальное поведение. Но, в этом случае, как я могу поймать конец моей цепи, даже если некоторые из них потерпели неудачу?