【问题标题】:Handling different success and fail states for multiple ajax call using deferred objects in jQuery使用 jQuery 中的延迟对象处理多个 ajax 调用的不同成功和失败状态
【发布时间】:2014-11-27 12:46:38
【问题描述】:

$.when 为同时查询的所有多个 ajax 调用返回一个 Deferred 对象。

如果一切成功.done() 执行,如果任何一个url 失败.fail() 执行。

如何处理部分成功状态? (即)如果5个url被传递给$.when,如果3个成功我们需要处理成功状态,2个失败我们需要处理失败状态。

$.when($.getJSON(headerUrl), $.getJSON(tasksUrl), $.getJSON(testingTrackerUrl), $.getJSON(highlightsUrl)))
    .then(function(headerData, tasksData,testingTrackerData,highlightsData) {
        printData(headerData, tasksData,testingTrackerData,highlightsData);
    })
    .fail(function(data, textStatus, jqXHR) {
        console.error('Got error in '+jqXHR);
});

【问题讨论】:

  • 你不能用$.when 做到这一点,它会创建一个master deferred,当所有底层promise 都解决时解决,或者当底层promise 之一失败时失败。没有中间人,如果你想为不同的ajax调用处理不同的状态,你必须单独做。
  • @adeneo 是的,我知道不可能有中间状态。但是想知道如何处理多个 ajx 调用的部分成功和失败状态。我们可以利用 jqXHR 的 readystate 并识别每个调用的状态吗?或者jQuery中还有其他方法吗?
  • 您为每个 ajax 调用使用适当的回调。
  • @adeneo 需要异步调用。粘贴上面的代码sn-p。请让我知道继续处理每个 ajax 调用的回调
  • 您基本上必须实现$.when() 的新版本(也许$.whenAll() 在最后一个承诺完成之前不会完成。您甚至可以获取$.when() 的代码,更改函数名并稍作修改。

标签: jquery deferred


【解决方案1】:

试试

var request = function (url) {
        return $.getJSON(url)
}
, requests = [
    headerUrl
    , tasksUrl
    , testingTrackerDataUrl
    , highlightsDataUrl
];
// return array of `resolved` , `rejected` jqxhr objects
$.when(
    $.map(requests, function (_request, i) {
         return request(_request)
    })
)
// do stuff with `resolved` , `rejected` jqxhr objects
.always(function (arr) {
    $.each(arr, function (key, value) {
        // `success`
        value.then(function (data, textStatus, jqxhr) {
            console.log(data, textStatus, jqxhr);
            printData(data)
        }
        // `error`
        , function (jqxhr, textStatus, errorThrown) {
            console.log(jqxhr, textStatus, errorThrown)
        })
    })
});

jsfiddle http://jsfiddle.net/guest271314/91Lomwr3/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 2014-03-25
    • 2016-04-29
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多