Javascript模块模式和jquery Ajax等待问题
我编写了一个自定义js模块,它基本上发送消息,需要等待响应才能继续:Javascript模块模式和jquery Ajax等待问题,javascript,jquery,wait,module-pattern,Javascript,Jquery,Wait,Module Pattern,我编写了一个自定义js模块,它基本上发送消息,需要等待响应才能继续: var manageBooking = (function (jQ) { //decalre private variables var domain, msgRecieved, msgResponse, validationValue; //decalre private functions var sendMessage, wait; // A private variables domain = document.d
var manageBooking = (function (jQ) {
//decalre private variables
var domain, msgRecieved, msgResponse, validationValue;
//decalre private functions
var sendMessage, wait;
// A private variables
domain = document.domain;
msgRecieved = false;
msgResponse = null;
wait = function(timeOutStep){
var w;
console.log('msgRecieved', msgRecieved);
if (msgRecieved === true) {
clearTimeout(w);
return;
} else {
console.log('waiting..');
w = setTimeout(wait, timeOutStep, timeOutStep);
}
}
// A private function to send messages
sendMessage = function( requestURL, data, type ) {
console.log(requestURL);
console.log(data);
console.log(type);
//reset vars to defaults
msgRecieved = false;
msgResponse = null;
jQuery.ajax({
url: "http://"+domain+"/_ajax/"+requestURL,
dataType: "html",
async: true,
data: data,
type: type,
success: function(msg){
console.log(msg);
msgResponse = msg;
msgRecieved = true;
}
});
console.log('after ajax call');
wait(500);
console.log('after wait');
console.log('msgRecieved', msgRecieved);
return;
};
return {
// A public variable
errorMsg: "",
validationName: "",
bookingID: "",
output: "",
// A public function to login
login: function( enteredBookingID, enteredSurname ) {
// Call private sendMsg
sendMessage("user_login/"+enteredBookingID+"/"+enteredSurname, null, 'GET');
console.log(msgResponse);
throw "error";
//check response
var patt=/Sorry/i;
//test pattern
var result=patt.test($.trim(msgResponse));
//if false OK
if (result === false) {
var split = msgResponse.split('|');
validationName = split[0];
validationValue = split[1];
bookingID = enteredBookingID
return true;
}
//else error
errorMsg = msgResponse;
return false;
}
};
})(jQuery);
manageBooking.login(123,123);
我遇到的问题是强制sendMessage
函数等待ajax完成并将msgRecieved
设置为true
但是,sendMessage
功能似乎会点击wait
功能一次,然后继续。
以下控制台输出显示了事件的顺序:
GET http://website/_ajax/user_login/123/123
after ajax call //sendMessage()
msgRecieved, false //wait()
waiting.. //wait()
after wait //sendMessage()
msgRecieved, false //sendMessage()
null//login()
uncaught exception: error //login()
<p>Sorry, we cannot locate your details. </p> <!-- jQuery Ajax call -->
msgRecieved, true //wait()
GEThttp://website/_ajax/user_login/123/123
ajax调用//sendMessage()之后
msgRecieved,false//wait()
等待//等等
等待后//发送消息()
msgRecieved,false//sendMessage()
null//login()
未捕获异常:错误//登录()
抱歉,我们找不到您的详细信息
msgRecieved,true//wait()
我感到困惑的是,wait
函数似乎在末尾再次启动
有谁能给我一些关于如何让它工作的建议吗?您应该尝试使用JavaScript setInterval函数而不是setTimeout。但这一次,将sendMessage分解,并将接收到ajax消息后需要执行的部分置于setInterval之下 收到ajax消息后,sendMessage的第二部分将运行(messagereceived为true之后),并清除间隔 这是因为setTimeout()只在设置的时间间隔后执行一次 setInterval()重复执行exery interval,直到清除为止 可以找到更多信息
希望这有帮助 问题可能与
w
变量的范围有关,因为在第二次调用时(在等待函数中,进入else
分支),您正在销毁对先前创建的超时的引用,因此clearTimeout无法工作:尝试在立即外部作用域中定义它。JavaScript以异步方式运行,这意味着它不等待
代码中有一部分如下所示:
jQuery.ajax({
url: "http://"+domain+"/_ajax/"+requestURL,
dataType: "html",
async: true,
data: data,
type: type,
success: function(msg){
console.log(msg);
msgResponse = msg;
msgRecieved = true;
}
});
当响应到达success
函数时,您应该将要运行的代码放在函数中,如下所示:
success : function (msg) {
handleMessage(msg); // Or any other manipulation to the received message
}
function handleMessage(msg) {
// Work with your received message here.
}
success
将与收到的消息一起调用,这是一个回调
实现sendMessage
的正确方法如下:
sendMessage = function( requestURL, data, type, callback ) {
console.log(requestURL);
console.log(data);
console.log(type);
//reset vars to defaults
msgRecieved = false;
msgResponse = null;
jQuery.ajax({
url: "http://"+domain+"/_ajax/"+requestURL,
dataType: "html",
async: true,
data: data,
type: type,
success: function(msg){
console.log(msg);
msgResponse = msg;
msgRecieved = true;
// Call the callback function to notify the message
// was received
callback();
}
});
};
然后像这样使用它:
sendMessage(urlHere, dataHere, typeHere, function () {
// Message has been received, msgResponse and msgReceived
// have already been updated. Do what you need here
});
嗨,谢谢,我知道这不是等待-我试图强迫它。原因是,我在页面上只有一个ajax调用,其他函数使用它,而不必为每个函数定义一个新的ajax调用(例如不重复代码)。除此之外,我让js在全局范围内像上面一样工作,但我尝试在
manageBooking
范围内这样做ajax成功函数..我明白了。好的,在JavaScript中确实没有必要这样做,如果你愿意,你可以让事件循环保持忙碌(比如而(timePassed<500){}
但是它只会消耗资源而不是空闲。没有办法让JavaScript在空闲状态下本机等待。同意。没有本机方法,但肯定是setInterval()
或setTimeOut
函数应暂停执行,直到变量设置为true?setTimeOut的工作方式如下:setTimeOut(函数(){/*要执行的回调代码*/},1000);
,将在一秒钟后执行指定的函数。即使setTimeout不等待,它也只是安排稍后执行,并继续处理。这确实允许它像我预期的那样循环,但它仍然只在代码继续返回到登录
函数后执行。使用回调,而不是对抗JavaScr的方式ipt计划进行编程:)