如果Javascript不是多线程的,有没有理由实现异步Ajax队列?

时间:2013-02-12 20:59:16

标签: 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 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 http://ejohn.org/blog/how-javascript-timers-work/上的John Resig(jQuery extra-ordinaire)

既然如此,由于Javascript已经排队我的请求,我在这里提出的功能不会产生任何结果吗?奇怪的是它似乎彻底改变了它。我的服务器崩溃的次数较少,(认为它不是任何想象力的解决方案 ...),并且在崩溃并重新启动之后,之前排队的ajax请求被发送,当它们早些时候似乎都被立即发送并在服务器崩溃时消失得无影无踪。

如果是单线程的Javascript,则会将非同步事件排队:

  1. 拥有Ajax请求管理器或队列是否有任何意义?
  2. 为什么我的代码会产生任何结果?

1 个答案:

答案 0 :(得分:4)

Javascript是单线程的,但是一旦发送了AJAX请求,它就不在javascript的手中,可以这么说。这是AJAX的异步部分。发出请求,然后代码继续。然后,当收到响应时,它将被处理。请求不排队。