javascript - 如果 Javascript 不是多线程的,是否有任何理由实现异步 Ajax 队列?

标签 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 事件处理的文章,例如 http://ejohn.org/blog/how-javascript-timers-work/ 上的这篇文章作者:John Resig(非凡的 jQuery)

既然如此,我在这里介绍的函数不会产生任何结果,因为 Javascript 已经在排队我的请求了吗?奇怪的是它似乎彻底改变了它。我的服务器崩溃较少,(不是那个认为它是解决方案任何想象中......啊),并且在它崩溃并重新启动后,之前排队的 ajax请求被发送,而早些时候它们似乎全部被一次发送并在服务器崩溃时消失在稀薄的空气中。

如果 Javascript 是单线程的,则对异步事件进行排队:

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

最佳答案

Javascript 是单线程的,但是一旦发送了 AJAX 请求,就可以说它不受 javascript 的控制。那是 AJAX 的异步部分。发出请求,然后代码继续。然后在收到响应时对其进行处理。请求不排队。

关于javascript - 如果 Javascript 不是多线程的,是否有任何理由实现异步 Ajax 队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14841718/

相关文章:

c# - 在 C# 中使用队列?

javascript - 在非 onionified Cycle.js 应用程序中使用 cycle-onionify

javascript - 页面加载后动态加载谷歌字体

python - 在python中实现循环队列-级别标准

jquery - $ ("#orderedlist").find ("li") 和 $ ("#orderedlist li") 之间的差异

javascript - 单击复选框时检查复选框的选中状态

java - 使用 ConcurrentLinkedQueue 进行一些非原子操作

javascript - HTML5 输入类型单选返回值到 Javascript

javascript - 原型(prototype)、对象、构造函数、 "this"、函数

javascript - 带有 Meteor 的 Google map 无法正常工作