JQuery - Promise和格式响应数组

时间:2013-12-23 09:26:32

标签: javascript jquery jquery-deferred

我正在使用一系列延迟对象。此数组的大小很大,因此它可以包含一个或多个延迟对象。处理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 ]

有没有办法获得相同的响应格式?

1 个答案:

答案 0 :(得分:2)

您在问题中提到的行为是设计使然,并且由于$.when()仅在收到多个参数时才创建自​​己的主承诺。

然而,非延迟参数被视为已返回这些参数的已解决的promise。因此,您可以系统地将null作为额外参数传递给$.when(),例如:

$.when.apply($, [null].concat(array_ajax_calls)).then(...)

如果您这样做,then()回调中的回复将始终采用以下形式:

[
    null,
    [Array[1] , "success",  Object],
    ...
]

从那里,你只需要忽略第一个元素并处理所有其他元素。