使用意外数量的参数处理jQuery.when.apply

时间:2016-08-26 14:52:01

标签: javascript jquery

我需要触发多个请求,保留顺序并忽略错误。作为第一个计时器javascript程序员,在搜索了文档和代码之后,出现了以下模式:

var requests = [];
for (yadda yadda) {
    request.push($.ajax())
}
$.when.apply(null, requests).always(function () {
    for (var i = 0; i < arguments.length; i++) {
        var result = arguments[i];
        // do things 
    }    
})

我的理解是,当以这种方式调用时,会创建一个延迟的主延迟,只有在请求中的所有延迟完成时(无论是否成功)都会触发。

不幸的是,上述代码在请求只包含一个元素的情况下不起作用。当发生这种情况时,when以不同的方式运行,而我的always()回调不接收长度为1的数组,而是接收单个响应对象,解压缩。

我看到了这个问题的解决方案,但没有一个是惯用的(或者是另一种方法)。

1 个答案:

答案 0 :(得分:0)

这是一种解决方法,但为什么不使用length results来确定您的预期响应?然后,您将始终拥有一个可以使用的预期array

if( requests.length == 1 ) {
    arguments = [arguments];
}

<强> Working example.

另一个解决方案是更改结构并以正确的jQuery模式使用它。然后,您将始终收到array的回复,并且没有进一步加倍。

$.when(requests).always(function(response) {
    response.forEach(r => console.log(r));
})

<强> Working example.

请注意,你的例子中有一个拼写错误。它应该是requests,而不是request

requests.push($.ajax());