如果失败,如何使jquery $ .when语句重新启动?

时间:2012-01-13 22:40:24

标签: javascript jquery ajax

所以有时候由于某种服务器异步性问题,或者某种东西......我不知道是什么,但它只是偶尔发生一次(s_mcir_2调用自己的跨域的AJAX函数,所以另一个我认为服务器可能不可靠)..无论如何,每隔一段时间结果从s_mcir_2返回为null而不是JSON对象。

当发生这种情况时,我想测试它是否为空,然后如果是,则让$ .when语句重新发送..理论上直到它收到有效输出。

有什么想法吗?

$.when(s_mcir_2(alt, data[l_alt])).then(function(result) {
     //EVALUATE "result"
});

3 个答案:

答案 0 :(得分:1)

延迟对象只能解析一次。

尝试使用在失败时调用自身的命名函数。

function myFn () {
  $.when(s_mcir_2(alt, data[l_alt])).then(function(result) {
    //EVALUATE "result"
    if (!result) {
      setTimeout(myFn,125);
      log("R_MCIR_2 has failed");
    }
    else {
      // success, do stuff
      ...
    }
  });
}

答案 1 :(得分:1)

.then()可以使用两个回调函数,一个用于done,另一个用于fail。如果在函数内部运行代码,则可以递归地重新运行AJAX请求(请注意,这可能会产生无限循环):

var failedCount = 0;
function some_func() {
    $.when(s_mcir_2(alt, data[l_alt])).then(

    //done callback
    function(result) {
        //EVALUATE "result"
    },

    //fail callback
    function () {
        failedCount++;
        if (failedCount < 10) {
            //try again
            some_func();
        }
    });
}

.then()的文档:http://api.jquery.com/deferred.then

此代码假定s_mcir_2()函数返回jqXJR对象(例如return $.ajax(...))。

注意我在失败的函数中添加了一个计数器,因此这个过程不会无限延续。一旦发出10个请求,递归就会停止。

<强>更新

如果不是jqXHR对象被拒绝,如果它被解析为success,你可以检查服务器响应,如果它是空的(例如typeof(serverResponse) == 'null'),那么重新运行some_func()功能。

答案 2 :(得分:0)

function attempt(){
    $.when(s_mcir_2(alt, data[l_alt])).then(function(result) {
         //EVALUATE "result"
    }).fail(function(result) {
        log("R_MCIR_2 has failed");
        setTimeout(attempt,500)
    });
}