我正在使用一系列延迟对象。此数组的大小很大,因此它可以包含一个或多个延迟对象。处理ajax调用时会出现问题。代码如下:
$.when.apply($, array_ajax_calls).then(...)
当使用.when和.apply时,如果数组只有一个promise对象,则响应是一个包含三个对象的数组:
// Return the object, the status and the jqXHR object
[Array[1] , "success", Object ]
如果数组包含多个对象,则返回一个响应数组,如前一个。
[
[Array[1] , "success", Object ],
[Array[1] , "success", Object ],
...
]
如您所见,回应是不同的。第一个返回一个包含三个值的数组。第二个返回包含三个值的数组数组。这使我必须检查是否为一个或多个对象执行了ajax调用并更改逻辑,因为响应具有不同的格式。
我不知道为什么我应该得到不同的回应。如果我将一个承诺数组(即使只有一个承诺)传递给.apply(...)函数,我希望得到:
[ [Array[1] , "success", Object ] ]
而不是
[Array[1] , "success", Object ]
有没有办法获得相同的响应格式?
答案 0 :(得分:2)
您在问题中提到的行为是设计使然,并且由于$.when()
仅在收到多个参数时才创建自己的主承诺。
然而,非延迟参数被视为已返回这些参数的已解决的promise。因此,您可以系统地将null
作为额外参数传递给$.when()
,例如:
$.when.apply($, [null].concat(array_ajax_calls)).then(...)
如果您这样做,then()
回调中的回复将始终采用以下形式:
[
null,
[Array[1] , "success", Object],
...
]
从那里,你只需要忽略第一个元素并处理所有其他元素。