在进行Ajax时调用JQuery Ajax Anonymus回调函数会被覆盖

时间:2019-03-27 11:49:42

标签: javascript jquery

我在此函数调用上有时间或示波器问题。。或者不知道是什么。

 AjaxHandlerByClass('url', {clientName: this.clientName}, function (response) { this code gets never called})
 AjaxHandlerByClass('url', {clientName: this.clientName}, function (response) { This code gets called 2 times})

通过此功能

function AjaxHandlerByClass(className, postData, callback, callbackFail) {

    var timestamp = new Date().getTime();

    var me = this;
    me.backHandler = function (data) {
        if (data)
            if (data.responseJSON || data.debug) {
                if (data.debug)
                    var debug = data.debug;
                else if (data.responseJSON && data.responseJSON.debug)
                    var debug = data.responseJSON.debug;
                if (window.console) {
                    for (var key in debug) {
                        if (debug.hasOwnProperty(key)) {
                            //    console.log(debug[key]);
                        }
                    }
                }

            }
        if (me.mode = 'callback') { 
            callback(data); //<--- this is the bug location
        } else {
            callbackFail(data);
        }
    };

    this.ok = function (data) {
        me.mode = 'callback';
        me.backHandler(data)
    }

    this.notOk = function (data) {
        me.mode = 'callbackFail';
        me.backHandler(data)
    }

    $.ajax(
        {
            contentType: "application/json; charset=utf-8",
            url: className + '?ts=' + timestamp + '&sid=' + sid,
            type: 'post',
            data: JSON.stringify(postData),
            dataType: 'json',
            cache: false,
            success: me.ok,
            error: me.notOk
        }
    );
}

第一个回调函数永远不会执行,而第二个回调函数却会执行两次。

该错误发生在代码的if(me.mode ='callback')部分。 我已经尝试了其他方法来使回调函数正确地执行。

第一次尝试是将回调函数存储在Function范围本身中。 将其分配给this.callback,然后尝试通过me.scope访问它 这没有用。然后我尝试直接访问变量..而且也没有帮助...

    this.callback = callback;
    this.callbackFail = callbackFail;

    var me = this;
    me.backHandler = function (data) {
        if (data)
            if (data.responseJSON || data.debug) {
                if (data.debug)
                    var debug = data.debug;
                else if (data.responseJSON && data.responseJSON.debug)
                    var debug = data.responseJSON.debug;
                if (window.console) {
                    for (var key in debug) {
                        if (debug.hasOwnProperty(key)) {
                            //    console.log(debug[key]);
                        }
                    }
                }

            }
        me[me.mode](data);
    };

我快要死了。

1 个答案:

答案 0 :(得分:0)

首先,在代码中永远不会定义callBackFail。

function AjaxHandlerByClass(className, postData, callback, callbackFail)

您传入三个参数: className postData 回调

AjaxHandlerByClass('url', {clientName: this.clientName}, function (response) { this code gets never called})

第二,这行应该是我。模式 === 'callback',而不是me.mode = 'callback'

if (me.mode === 'callback') { 
  callback(data);
} else {
   callbackFail(data);
}

您已将函数命名为AjaxHandlerByClass,我假设您想将其用作类。您已将其声明为函数。常规函数在被调用(调用)时执行,从而导致对AjaxHandlerByClass()的第二次调用呈现两次。为了解决您的问题,您可以使用new关键字创建AjaxHandlerByClass的新实例。

const firstRequst = new AjaxHandlerByClass('url', {clientName: "https://swapi.co/api/people/"}, successCallback, failCallback);

const secondRequst = new AjaxHandlerByClass('url', {clientName: "https://swapi.co/api/planets/"}, successCallback, failCallback);

或者,如果您要等待第一个请求完成之后再调用第二个请求,则可以实现Promise。有关Promise here的更多信息。

我创建了一个带有一些修改的js小提琴here(交换了api,并重命名了一些变量以用于测试)。一个ajax请求成功,另一个失败。结果在开发人员控制台中可见。请注意,该小提琴不是完美编写的,只是出于演示目的的一些伪代码。