Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript模块模式和jquery Ajax等待问题_Javascript_Jquery_Wait_Module Pattern - Fatal编程技术网

Javascript模块模式和jquery Ajax等待问题

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

我编写了一个自定义js模块,它基本上发送消息,需要等待响应才能继续:

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计划进行编程:)