jQuery延迟-“始终"在第一次拒绝时被召唤 [英] jquery deferred - "always" called at the first reject

查看:66
本文介绍了jQuery延迟-“始终"在第一次拒绝时被召唤的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用$.when链接一些延期的对象,并且如果其中一个失败,即使我在待定"状态下仍存在一些延迟器,也会在失败后立即调用always方法.

I'm using $.when to chain some Deferred objects, and if one of them fail, the always method will be called directly after the failure, even if I still have some deferrer in a "pending" state.

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 .

也许这是正常现象.但是,在这种情况下,即使其中一些失败了,我怎么也能抓住链条的尽头?

Maybe it's the normal behavior. But, in this case, how can I catch the end of my chain even if some of them have failed?

推荐答案

它是设计使然:该方法将在所有Deferred解析后立即解析其主Deferred,或者在一个时立即拒绝主Deferred 的递延被拒绝. [...] 请注意,此时某些延期交货仍可能未解决.

It's by design: The method will resolve its master Deferred as soon as all the Deferreds resolve, or reject the master Deferred as soon as one of the Deferreds is rejected. [...] Note that some of the Deferreds may still be unresolved at that point.

http://api.jquery.com/jQuery.when/

您可以保存对所有延期的引用,并分别进行跟踪.

You can save references to all deferreds and track them separately.

类似这样的东西:

var whenAll = function() {
   var dfd = $.Deferred(),
       len = arguments.length,
       counter = 0,
       state = "resolved",
       resolveOrReject = function() {
           if(this.state() === "rejected"){
               state = "rejected";
           }
           counter++;

           if(counter === len) {
               dfd[state === "rejected"? "reject": "resolve"]();   
           }

       };


    $.each(arguments, function(idx, item) {
        item.always(resolveOrReject); 
    });

   return dfd.promise();    
};

http://jsfiddle.net/cSy2K/2/

这篇关于jQuery延迟-“始终"在第一次拒绝时被召唤的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆