【问题标题】:JQuery - Array of Promises and format responseJQuery - 承诺数组和格式响应
【发布时间】:2014-01-02 16:41:14
【问题描述】:

我正在使用延迟对象数组。这个数组的大小是 vble,所以它可以有一个或多个延迟对象。处理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 ]

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

【问题讨论】:

    标签: javascript jquery jquery-deferred


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 如果您将数组传递给 .when,正如您在回答中所说,这将被视为已解决的承诺,因此答案将是一个包含未解决承诺的数组。
    • @kitimenpolku,我不确定你的评论是否理解。我们没有将数组传递给$.when(),而是apply()将数组传递给函数,这导致数组元素作为单独的参数传递给$.when()
    猜你喜欢
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2019-11-07
    • 1970-01-01
    相关资源
    最近更新 更多