如何在JavaScript中没有顺序的情况下单独运行多个异步函数而不会相互干扰?

时间:2017-03-10 15:50:50

标签: javascript asynchronous polymer client-side-scripting polymer-1.x

我想知道它是否可行,如何在客户端没有订单的情况下分别运行多个JavaScript函数。

如果不可能有解决方法吗?

1 个答案:

答案 0 :(得分:4)

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

如果您需要进行繁重的JavaScript处理并希望保持主UI线程可用,以便UI响应,您可以将处理卸载到web workers,它在主UI线程的单独线程上运行,同时进行。

这是一个简单的Web worker示例(来自my answer here):

主要的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!");

worker.js

self.addEventListener("message", function(e) {
  if (e.data && e.data.command == "go") {
    for (var i = 0; i < 1000000000; i++); // kill time
    self.postMessage({command: "log", message: "Order: " + e.data.order + " completed"});
  }
});