javascript - 当一组 deferred 中的一个失败时如何处理

标签 javascript ajax jquery jquery-deferred

我有一系列的 ajax 调用来填充页面上的列。

var doneDefers = function(defer) {
        // leftColDefer is another deferred that sets some header info
    $.when(defer, leftColDefer).done(function(req1, req2){
        var data = req1[0],
        head = req2[0];
        // spit this data out to elements on the page   

    });
};  
for(i=0;i<window.ids.length;i++){
    defer[i] =  $.ajax({
        url: 'api/get_runs_stats.php',
        type: 'GET',
        dataType: 'json',
        data: {
            run_id: window.ids[i]
        }
    });
    doneDefers(defer[i]);
}

这很好用。如果 ajax 调用失败,则不会输出任何内容,世界一切正常。 现在我想根据所有吐出的数据进行一些计算。

$.when.apply(null, defer)
    .done(function() {
        var args = Array.prototype.slice.call(arguments);
        calcDeltas();

    })
    .fail(function() {
        var args = Array.prototype.slice.call(arguments);
        console.log('in list fail');
    });

done 函数工作正常,没有任何 ajax 调用失败。如果其中一个失败,我将进入失败函数,并且无法访问其他运行的任何返回数据。参数数组仅包含失败调用的数据。

我想对通过的数据集进行计算。当其中一个调用失败时,如何从良好的调用中获取数据?

最佳答案

我不确定这是最简单的解决方案,但它有可能起作用。

var ajax_always_promises = [],//to be populated with promises that (barring uncaught error) are guaranteed to be resolved.
    data_arr = [],//an array to be (sparsely) populated with asynchronously delivered json data.
    error_arr = [];//an array to be (sparsely) populated with ajax error messages.

$.each(window.ids, function(i, id) {
    var dfrd = $.Deferred();
    var p = $.ajax({
        url: 'api/get_runs_stats.php',
        type: 'GET',
        dataType: 'json',
        data: {
            run_id: window.ids[i]
        }
    }).done(function(json_data) {
        data_arr[i] = json_data;//intentionally not `data_arr.push(json_data);`
    }).fail(function(jqXHR, textStatus, errorThrown) {
        error_arr[i] = textStatus;//intentionally not `error_arr.push(textStatus);`
    }).always(dfrd.resolve);

    ajax_always_promises[i] = dfrd.promise();
    doneDefers(p);
});

$.when.apply(null, ajax_always_promises).done(function() {
    //The data in the (sparsely) populated arrays `data_arr` and `error_arr` is available to be used. 
    var i, id, success_count=0, error_count=0;
    for(i=0; i<Math.max(data_arr.length,error_arr.length); i++) {

        //Here, the index i corresponds to the original index of window.ids ...
        //...that's the advantage of sparsely populating the arrays.
        id = window.ids[i];
        if(data_arr[i]) {
            //Here, do whatever is required with `data_arr[i]`, and `id` if needed.
            success_count++;
        }
        else if(error_arr[i]) {
            //Here, do whatever is required with `error_arr[i]`, and `id` if needed.
            error_count++;
        }
    }
    console.log("Success:errors: " + success_count + ':' + error_count);
});

未经测试 - 可能需要调试

关于javascript - 当一组 deferred 中的一个失败时如何处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21297340/

相关文章:

javascript - Bazel Typescript - 找不到 ts_library 由 module_name 引用

Javascript两个 "For"循环循环从3个数组中获取数据

javascript - 尽管对象存在,但未定义 JS Ajax onreadystatechange

jquery - 使 html 选择看起来像 span 的 css 类

javascript - 如何在用户重新加载页面时更新图像/ Logo ?

javascript - 如何全局替换 JavaScript 字符串中的正斜杠?

javascript - AngularJS $watch 不适用于过滤的 ng-repeat

php - Ajax/Internet Explorer 编码问题

jquery - 有没有办法从服务器获取可编辑数据表中的 aocolumns?

php - 我究竟可以从 jQuery AJAX 请求返回什么?