如果Javascript不是多线程的,有没有理由实现异步Ajax队列?
我的php服务器有问题(我的计算机是唯一的连接)。我最初认为部分原因是因为ajax请求太多(我有一个脚本,每次击键都执行一个ajax请求),所以我实现了一个设计来控制进入队列的ajax请求流。下面是我的代码:如果Javascript不是多线程的,有没有理由实现异步Ajax队列?,javascript,jquery,queue,single-threaded,Javascript,Jquery,Queue,Single Threaded,我的php服务器有问题(我的计算机是唯一的连接)。我最初认为部分原因是因为ajax请求太多(我有一个脚本,每次击键都执行一个ajax请求),所以我实现了一个设计来控制进入队列的ajax请求流。下面是我的代码: //global vars: activeAjaxThread = 0; //var describing ajax thread state ajaxQue = []; //array of ajax request objects in queue to be fired after
//global vars:
activeAjaxThread = 0; //var describing ajax thread state
ajaxQue = []; //array of ajax request objects in queue to be fired after the completion of the previous request
function queRequest(ajaxObj) {
ajaxQue.push(ajaxObj);
if (activeAjaxThread == 0) {
fireOffAjaxQue();
} else {
return 'ajax thread is running';
}
}
function fireOffAjaxQue () {
activeAjaxThread = 1;
//getLastRequest();
if ((ajaxQue.length > 0) && activeAjaxThread == 1) {
$.ajax(ajaxQue[0]).always( function () {
ajaxQue.shift();
if (ajaxQue.length > 0) {
fireOffAjaxQue(); //fire off another ajax request since this one has been completed.
}
});
}
activeAjaxThread = 0; //thread has finished executing
}
实施:
//create ajax object
var ajaxObj = {
url: 'someplace.php',
data: dataVar,
success: function (data) {...}
};
//send ajax object to que
queRequest(ajaxObj);
然后我发现Javascript是多线程的,并阅读了一些关于Javascript事件处理的文章,例如John Resig(jQuery extra Ordinire)的文章
在这种情况下,我在这里介绍的函数不会产生任何结果吗?因为Javascript已经在排队等待我的请求了?奇怪的是,它似乎彻底改变了它。我的服务器崩溃较少(这并不是想象中的一个解决方案,,argh),在它崩溃并重新启动后,先前排队的ajax请求会被发送,而之前的请求似乎会立即发送,并在服务器崩溃时消失在空气中
如果Javascript是单线程的,将异步事件排队:
Javascript是单线程的,但是一旦AJAX请求被发送,可以说它就不在Javascript的控制之下了。这是AJAX的异步部分。发出请求,然后代码继续。然后,当收到响应时,将对其进行处理。请求不排队。Javascript是单线程的,但是一旦AJAX请求被发送,可以说它就不在Javascript的控制之下了。这是AJAX的异步部分。发出请求,然后代码继续。然后,当收到响应时,将对其进行处理。请求没有排队。哦,我明白了。。。所以区别在于,通过这种方式,请求将在最后一个请求返回后触发。令人惊叹的谢谢你澄清了这一点:P。这么长的问题和这么简单的答案:P。@theweirderd还检查了这个答案:--你的异步请求可能最终是有效同步的,这可能会导致你在服务器端看到的问题。这也可能有助于解释为什么你的脚本会产生影响——它最终会将请求延迟足够长的时间,以缓解我在该回答中讨论的问题。@Chris感谢链接,但我的问题不是会话,我没有使用会话。由于某种原因,Apache只是倾向于随机崩溃php5.dll,我注意到它发生在Ajax请求期间。我不知道发生了什么,没有错误代码,也没有从服务器返回数据。我检查了我的php代码,似乎一切正常。我想我需要为此写一个单独的问题。膝盖真疼。啊,太糟糕了!我想可能有关系。WAMP可以很棒。。。或者是屁股痛,祝你好运!哦,我明白了。。。所以区别在于,通过这种方式,请求将在最后一个请求返回后触发。令人惊叹的谢谢你澄清了这一点:P。这么长的问题和这么简单的答案:P。@theweirderd还检查了这个答案:--你的异步请求可能最终是有效同步的,这可能会导致你在服务器端看到的问题。这也可能有助于解释为什么你的脚本会产生影响——它最终会将请求延迟足够长的时间,以缓解我在该回答中讨论的问题。@Chris感谢链接,但我的问题不是会话,我没有使用会话。由于某种原因,Apache只是倾向于随机崩溃php5.dll,我注意到它发生在Ajax请求期间。我不知道发生了什么,没有错误代码,也没有从服务器返回数据。我检查了我的php代码,似乎一切正常。我想我需要为此写一个单独的问题。膝盖真疼。啊,太糟糕了!我想可能有关系。WAMP可以很棒。。。或者是屁股痛,祝你好运!如果问题得到了恰当的回答,那么接受答案就很酷了。:-)如果问题得到了恰当的回答,那么接受答案就很酷了。:-)