【问题标题】:Can I group the results of jQuery's $.when method?我可以对 jQuery 的 $.when 方法的结果进行分组吗?
【发布时间】:2012-07-29 20:53:14
【问题描述】:

我有以下代码:

$('#remove-commercial-products-modal').find('form').submit(function() {                              
    var promises = [];
    var $modal = $(this).closest('.modal');                                                          

    $(this).find('input:checkbox:checked').each(function() {                                         
        promises.push(                                                                               
            $.ajax({
                url: '/commercial/products/unclaim/' + $(this).val() + '/',                          
                dataType: 'json',                                                                    
                timeout: 10000,                                                                      
                cache: false                                                                         
            }));                                                                                     
    });                                                                                              

    $.when.apply($, promises).done(function(result) {                                                
        $modal.modal('hide');                                                                        
    });                                                                                              

    return false;                                                                                    
});

所以,当我的表单被提交时,我收集了选中复选框的值,并创建了一个 promise 数组,每个 promise 都是一个 $.ajax 调用。

我的调用被执行,我的.done函数中的代码被执行。

但是,我认为.done 期望有一个 个参数,每个promise 一个参数。但我不知道我提前有多少,我希望得到一系列结果(每个结果都是 $.ajax 调用的响应。)

有人知道我是否可以将我的回复分组吗? 谢谢!

【问题讨论】:

    标签: jquery promise


    【解决方案1】:
    $.when.apply($, promises).done(function() {
        var l = arguments.length,
            i,
            jqxhr;
    
        for( i = 0; i < l; ++i ) {
            jqxhr = arguments[i][2]; //The i:th jQXHR passed  
        }                                                              
    });     
    

    docs

    【讨论】:

    • 谢谢。唯一的例外是,当数组中只有一个 promise 时,result 直接包含 $.ajax 调用的响应,而不是 promise 对象。
    • @SalvatoreIovene 这对 jQuery 来说太糟糕了...不过,您可以检查 arguments.length === 1 作为解决方法吗?
    • @Esalija 几乎...事实上,如果只有一个承诺,那么 arguments 包含该承诺。否则它包含一系列承诺。所以我需要检查我是否得到一个数组。
    • @SalvatoreIovene 啊,我明白了。 arguments.length !== promises.length 怎么样?因为 arguments.length3 有 1 个承诺,但如果有更多承诺,则与承诺的数量相同。
    • @Esalija 如果有 3 个承诺就会中断。因为那时你不知道你是否有一个或三个参数。
    猜你喜欢
    • 1970-01-01
    • 2014-06-09
    • 2016-08-27
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多