如何在JavaScript中无顺序地分别运行多个异步函数而不相互干扰?

如何在JavaScript中无顺序地分别运行多个异步函数而不相互干扰?,javascript,asynchronous,polymer,client-side-scripting,polymer-1.x,Javascript,Asynchronous,Polymer,Client Side Scripting,Polymer 1.x,我想知道这是否可能,以及如何在客户端不按顺序同时单独运行多个JavaScript函数 如果不可能,是否有解决方法?如果您只是想安排它们以任何顺序运行,那么可以这样做(使用setTimeout或其他方法)。如果他们在做等待ajax完成之类的事情,他们不会相互干扰。但是,如果他们在JavaScript代码中工作,那么在实际运行时,他们会让主UI线程保持忙碌 如果您需要执行繁重的JavaScript处理,并且希望保持主UI线程可用,以便UI响应,则可以将处理卸载到,该线程在主UI线程之外的单独线程上同

我想知道这是否可能,以及如何在客户端不按顺序同时单独运行多个JavaScript函数


如果不可能,是否有解决方法?

如果您只是想安排它们以任何顺序运行,那么可以这样做(使用
setTimeout
或其他方法)。如果他们在做等待ajax完成之类的事情,他们不会相互干扰。但是,如果他们在JavaScript代码中工作,那么在实际运行时,他们会让主UI线程保持忙碌

如果您需要执行繁重的JavaScript处理,并且希望保持主UI线程可用,以便UI响应,则可以将处理卸载到,该线程在主UI线程之外的单独线程上同时运行

下面是一个简单的web工作者示例(来自):

主JS文件:

function order(number) {
  var w = new Worker("worker.js");
  w.addEventListener("message", function(e) {
    if (e.data && e.data.command == "log") {
      console.log(e.data.message);
    }
    w = null;
  });
  console.log("Queuing order: " + number);
  w.postMessage({command: "go", order: number});
}

function takeOrder(number, cb) {
  console.log("Preparing order: " + number + "");
  cb(number);                                       // Call the callback
}
console.log("Starting to accept order");
for (var i = 0; i < 3; i++) {
  console.log("Taking order: " + i);
  takeOrder(i, order);                              // Pass order as the callback
}
console.log("Job completed!");

如果您只是想安排它们以任何顺序运行,那没关系,只需这样做(使用
setTimeout
或其他工具)。如果他们在做等待ajax完成之类的事情,他们不会相互干扰。但是,如果他们在JavaScript代码中工作,那么在实际运行时,他们会让主UI线程保持忙碌

如果您需要执行繁重的JavaScript处理,并且希望保持主UI线程可用,以便UI响应,则可以将处理卸载到,该线程在主UI线程之外的单独线程上同时运行

下面是一个简单的web工作者示例(来自):

主JS文件:

function order(number) {
  var w = new Worker("worker.js");
  w.addEventListener("message", function(e) {
    if (e.data && e.data.command == "log") {
      console.log(e.data.message);
    }
    w = null;
  });
  console.log("Queuing order: " + number);
  w.postMessage({command: "go", order: number});
}

function takeOrder(number, cb) {
  console.log("Preparing order: " + number + "");
  cb(number);                                       // Call the callback
}
console.log("Starting to accept order");
for (var i = 0; i < 3; i++) {
  console.log("Taking order: " + i);
  takeOrder(i, order);                              // Pass order as the callback
}
console.log("Job completed!");

@DominiqueFortin:一条主线(和你想要的尽可能多的网络工作者)。“…在不相互干扰的情况下”你需要更具体地了解这一点。你担心什么样的干扰?不会有数据竞争,但由于它们是异步的,没有顺序,因此它们可以以不可预测的顺序操作共享数据。是的,Web worker将同时执行(并且可以执行AJAX),但您没有访问DOM的权限,也不共享相同的环境(相同的变量)。您可以在这些线程之间进行通信,也可以通过postMessage与主线程进行通信。异步的全部含义是其他线程可以单独运行。@0x01Brain请发布该线程的代码以及您的问题所在。@DominiqueFortin:一个主线程(以及您想要的任意多个web工作线程)。“…互不干扰”你需要更详细地了解这一点。你担心什么样的干扰?不会有数据竞争,但由于它们是异步的,没有顺序,因此它们可以以不可预测的顺序操作共享数据。是的,Web worker将同时执行(并且可以执行AJAX),但您没有访问DOM的权限,也不共享相同的环境(相同的变量)。您可以在这些线程之间进行通信,也可以通过postMessage与主线程进行通信。异步的全部含义是其他线程可以单独运行。@0x01Brain请发布该线程的代码以及您的问题所在。