如果Javascript不是多线程的,有没有理由实现异步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

我的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 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是单线程的,将异步事件排队:

  • 拥有Ajax请求管理器或队列有什么意义吗
  • 为什么我的代码会产生任何结果

  • 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可以很棒。。。或者是屁股痛,祝你好运!如果问题得到了恰当的回答,那么接受答案就很酷了。:-)如果问题得到了恰当的回答,那么接受答案就很酷了。:-)