开发者问题收集

使用 Ajax 时 abort 或 readyState 未定义

2021-06-14
293

我收到以下代码的错误;

Uncaught TypeError: Cannot read property 'readyState' of undefined


当我尝试删除 readyState 以查看发生了什么时,我收到了该错误;

TypeError: Cannot read property 'abort' of undefined

get: function () {
    var ajaxReq = $.ajax({
            type: 'GET',
            url: data.url,
            dataType: "json",
            success: function (response, status) {
                callback(response);
            },
            beforeSend: function () {
                if (ajaxReq != 'ToCancelPrevReq' && ajaxReq.readyState < 4) {
                    ajaxReq.abort();
                }
            }
        });
}

该函数与按键一起工作;

keypress: function () {
        setTimeout(function () {
            if ($(OnePageCheckout.Selector.CardNumber).val().length == 7) {
                $(".payment-installment-container").removeClass("d-none");
                InvUtility.Loader.Open();
                var model = {
                    value: $(OnePageCheckout.Selector.CardNumber).val()
                }

                OnePageCheckout.OnCardNumberUpdate.event(model);
            }
        }, 1000)
        OnePageCheckout.OnCardNumberUpdate.init();
    },

按键发送请求很多次,我想确保成功过程只工作一次

2个回答

您应该在调用 $.ajax() 之前声明 ajaxReq 。然后在尝试使用它之前检查它是否不为空,而不是使用特殊值(如 ToCancelPrevReq )。

一旦您获得成功响应,您可以重置它,以便下一次按键可以再次发出 AJAX 请求。

var ajaxReq;
...
if (ajaxReq && ajaxReq.readyState < 4) {
  ajaxReq.abort();
}

$.ajax({
  type: 'GET',
  url: data.url,
  dataType: "json",
  success: function(response, status) {
    ajaxReq = null;
    callback(response);
  }
});
Barmar
2021-06-14

此代码解决了我的问题

我在 get 函数之外定义了变量。如果我在 GET 函数内部定义它,它会被视为新交易,因为它每次都会被清空。因此在相关函数之外定义它给出了正确的结果

var jqxhr = {abort: function () {}};

get: function(){    
  jqxhr.abort();
    var ajaxReq = $.ajax({
        type: 'GET',
        url: data.url,
        dataType: "json",
        success: function (response, status) {
            callback(response);
        }
    });
}
idiltugba
2021-06-15