用JavaScript编写线程

时间:2018-02-12 10:07:57

标签: javascript angularjs performance

我们可以在JavaScript中实现多线程吗?

如果是,请建议在JavaScript / Angular中的多个线程上运行多个任务的方法。

由于

2 个答案:

答案 0 :(得分:7)

您可以使用Web worker,这是一个不阻止UI的专用线程。 他们在后台线程中工作

  

Web Workers是Web内容在其中运行脚本的简单方法   背景线程。工作线程可以不执行任务   干扰用户界面。此外,他们可以执行I / O.   使用XMLHttpRequest(虽然是responseXML和channel属性   总是空的)。一旦创建,工作人员就可以向其发送消息   通过将消息发布到事件来创建它的JavaScript代码   由该代码指定的处理程序(反之亦然。)本文提供   关于使用网络工作者的详细介绍。

<强> mainThread.js

if (window.Worker) {
  var myWorker = new Worker('worker.js');

  // Posting data to worker
  myWorker.postMessage('Message posted to worker');

  // Receiving data from worker
  myWorker.onmessage = function(e) {
    console.log('Message received from worker: ' + e.data);
  }
}

<强> worker.js

onmessage = function(e) {
  // Receiving data from main thread
  console.log('Message received from main script: ' + e.data);

  // Posting data to the main thread
  postMessage('Posting message back to main script');
}

有关详细信息,请阅读MDN Web Workers

中的文档

答案 1 :(得分:1)

  

使用Web worker你可以实现多线程使用   使用service-worker,它将像您的代理服务器一样,您可以在网络级别实现多线程。

关于服务工作者的注意事项:

  • 它是JavaScript Worker,因此无法直接访问DOM。 相反,服务工作者可以与其控制的页面进行通信 通过响应通过postMessage接口发送的消息, 如果需要,这些页面可以操作DOM。
  • 服务工作者是一个可编程的网络代理,允许您 控制如何处理来自您网页的网络请求。
  • 它在不使用时终止,并在下次需要时重新启动, 所以你不能依赖服务工作者的全局状态 onfetchonmessage处理程序。如果有您的信息 需要在重新启动时保持并重用,服务工作者确实需要 访问IndexedDB API
  • 服务人员广泛使用承诺,所以如果你是新手 承诺,然后你应该停止阅读并查看Promises, an introduction