如何让jQuery.ajax同时覆盖error()&完整()单个子句?

时间:2014-05-23 16:35:57

标签: javascript jquery ajax

我有一个幻灯片,它使用ajax调用来获取我的数据:

jQuery.ajax({
    dataType: "json",
    timeout:8000,
    url:    full_fallback_uri,
    success: function(result) {
        //do stuff
    }, 
    error: function() {
        self.skip();
    }, 
    complete: function(xhr, data) {
        if (xhr.status != 200) {
            self.skip();
        }
    },                      
    asynch: false,
});

因此,如果ajax调用失败,则调用skip()以跳过当前幻灯片。

现在上面的设置不起作用,因为在出​​现错误的情况下,skip()被调用两次,导致双跳(跳过两个幻灯片而不仅仅是当前的幻灯片)。

如果我遗漏了     错误() 或者     complete()(检查http状态!= 200) 它还不够,但并不能涵盖所有可能的错误。

我怎样才能编写一个涵盖错误和完整案例的条款?

这样的事情会起作用吗?

jQuery.ajax({
    dataType: "json",
    timeout:8000,
    url:    full_fallback_uri,
    success: function(result) {
        //do stuff
    }, 
    error: function() {
        this.myErrorSign = true; //DEFINING MY OWN VARIABLE ON THIS jQuery.ajax object
        this.complete(); //MANUALLY CALL THE COMPLETE FUNCTION, IN CASE THIS ISN'T DONE AUTOMATICALLY UPON FAIL
    }, 
    complete: function(xhr, data) {
        if (xhr.status != 200 || this.myErrorSign == true) { //LOOK NOT ONLY FOR STS!=200 BUT ALSO FOR THE VARIABLE THAT WAS DEFINED IN THE ERROR CASE ABOVE
            self.skip();
        }
    },                      
    asynch: false,
});

或许这个设计也会有类似的缺陷,在某些情况下也会两次调用skip()?

2 个答案:

答案 0 :(得分:3)

您可以 .always并且不同的参数来自错误:

var ajaxRequest = jQuery.ajax({
    /* only settings, no callbacks, no error: fn(){}! */
});

ajaxRequest.always(function (jqXhr, statusText) {
    // gets called on complete and on error
    if (statusText === 'error') {
        skip();
    }
});

在我的本地计算机上工作,当被叫服务器关闭时。

查看jQuerys documentation on that

答案 1 :(得分:1)

使用以下简单的逻辑,你就不会出错 - 你非常接近。

  1. error回调始终在<{strong> complete回调之前触发(无论何时)。有一个可以被两个回调看到的变量,比如在{ajax调用之前error = false;初始设置为false

  2. error回调集error = true;就是这样。

  3. complete回调 - 此回调始终触发 - 请使用以下内容:

    if( error || (xhr.status != 200) ) { self.skip(); } //done ... you may want to have a way to reset error = false before a re-run

  4. 请注意,每个回调中的this指向回调函数,因此是本地的...具有范围更广的变量...在ajax调用之外。由于complete回调在错误和成功时触发,因此您无需显式调用它。 :)