在返回承诺时忽略Ajax失败?

时间:2015-07-22 10:02:29

标签: javascript jquery ajax

我不确定如何标题,希望它不会太混乱。我有一段js代码,它在对象列表上执行管道操作。它必须按顺序执行一系列ajax请求,并返回结果。这是一些非常简化的代码

var urls = [ 
    { url: "http://myurl.com/1", expected: "one" }, 
    { url: "http://myurl.com/2", expected: "two" }
];

$(document).on("click", "#runselftest", function () {
    for (var u in urls) {
        values.push(u);
        dfdNext = dfdNext.pipe(function () {
            return testUrl(values.shift());
        });
    }
    dfd.resolve();
});

testUrl = function (i) {                   
    return $.ajax({
        url: urls[i].url,
        dataType: "json"
    }).done(function (result) {
        if (result.result == urls[i].expected) {
            // yay
        }
        else {
            // aww
        }
    }).fail(function () {
        // this is causing the problem
    });
};

我希望我的操作即使在ajax中的失败条件下也能继续处理。但是,如果我return $.ajax并且第一次操作失败,则管道停止。如果我 return $.ajax,而是在.always中返回延迟的承诺,则ops异步发生。我希望它们按顺序同步发生。第二个操作系统必须等待第一个操作才能完成。

我是否需要重写代码或是否有简单的解决方案?

3 个答案:

答案 0 :(得分:1)

最好使用包装器延迟对象

testUrl = function (i) { 
    var d = $.Deferred();                  
    $.ajax({
        url: urls[i].url,
        dataType: "json",
        success: function(){
            d.resolve();
        },
        error: function(){
            d.reject();
        }
    });

    return d.promise();
};

你可以像这样使用它

var deferred = test();
deferred.always(function(){
    //you can pout your coce
});

答案 1 :(得分:0)

var promise1 = return $.ajax();
var promise2 = return $.ajax();

$.when(promise1, promise2).done(function(p1, p2) {
    //this will pipe them in order. If one fails it should move to the next, you just won't get any data from the failed promise
});

答案 2 :(得分:0)

这是您想要的最低要求:

testUrl = function (i) { 
    var d = $.Deferred();                  
    $.ajax({
        url: urls[i].url,
        dataType: "json"
    }).always(function(){
       d.resolve();
    });
    return d.promise();
};