我在此函数调用上有时间或示波器问题。。或者不知道是什么。
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);
};
我快要死了。
答案 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请求成功,另一个失败。结果在开发人员控制台中可见。请注意,该小提琴不是完美编写的,只是出于演示目的的一些伪代码。