当前位置: 首页 > news >正文

外贸网站模板免费下载重庆市建设工程信息网官网入口网址

外贸网站模板免费下载,重庆市建设工程信息网官网入口网址,大气的网站源码,cms网站开发需要学什么一、概述JavaScript 语言采用的是单线程模型#xff0c;也就是说#xff0c;所有任务只能在一个线程上完成#xff0c;一次只能做一件事。前面的任务没做完#xff0c;后面的任务只能等着。随着电脑计算能力的增强#xff0c;尤其是多核 CPU 的出现#xff0c;单线程带来… 一、概述JavaScript 语言采用的是单线程模型也就是说所有任务只能在一个线程上完成一次只能做一件事。前面的任务没做完后面的任务只能等着。随着电脑计算能力的增强尤其是多核 CPU 的出现单线程带来很大的不便无法充分发挥计算机的计算能力。Web Worker 的作用就是为 JavaScript 创造多线程环境允许主线程创建 Worker 线程将一些任务分配给后者运行。在主线程运行的同时Worker 线程在后台运行两者互不干扰。等到 Worker 线程完成计算任务再把结果返回给主线程。这样的好处是一些计算密集型或高延迟的任务被 Worker 线程负担了主线程通常负责 UI 交互就会很流畅不会被阻塞或拖慢。Worker 线程一旦新建成功就会始终运行不会被主线程上的活动比如用户点击按钮、提交表单打断。这样有利于随时响应主线程的通信。但是这也造成了 Worker 比较耗费资源不应该过度使用而且一旦使用完毕就应该关闭。Web Worker 有以下几个使用注意点。1同源限制分配给 Worker 线程运行的脚本文件必须与主线程的脚本文件同源。2DOM 限制Worker 线程所在的全局对象与主线程不一样无法读取主线程所在网页的 DOM 对象也无法使用document、window、parent这些对象。但是Worker 线程可以navigator对象和location对象。3通信联系Worker 线程和主线程不在同一个上下文环境它们不能直接通信必须通过消息完成。4脚本限制Worker 线程不能执行alert()方法和confirm()方法但可以使用 XMLHttpRequest 对象发出 AJAX 请求。5文件限制Worker 线程无法读取本地文件即不能打开本机的文件系统file://它所加载的脚本必须来自网络。二、基本用法2.1 主线程主线程采用new命令调用Worker()构造函数新建一个 Worker 线程。var worker  new Worker(work.js); Worker()构造函数的参数是一个脚本文件该文件就是 Worker 线程所要执行的任务。由于 Worker 不能读取本地文件所以这个脚本必须来自网络。如果下载没有成功比如404错误Worker 就会默默地失败。然后主线程调用worker.postMessage()方法向 Worker 发消息。worker.postMessage(Hello World);worker.postMessage({method: echo, args: [Work]});worker.postMessage()方法的参数就是主线程传给 Worker 的数据。它可以是各种数据类型包括二进制数据。接着主线程通过worker.onmessage指定监听函数接收子线程发回来的消息。worker.onmessage  function (event) {  console.log(Received message   event.data);  doSomething();} function doSomething() {  // 执行任务  worker.postMessage(Work done!);}上面代码中事件对象的data属性可以获取 Worker 发来的数据。Worker 完成任务以后主线程就可以把它关掉。worker.terminate(); 2.2 Worker 线程Worker 线程内部需要有一个监听函数监听message事件。self.addEventListener(message, function (e) {  self.postMessage(You said:   e.data);}, false);上面代码中self代表子线程自身即子线程的全局对象。因此等同于下面两种写法。// 写法一this.addEventListener(message, function (e) {  this.postMessage(You said:   e.data);}, false); // 写法二addEventListener(message, function (e) {  postMessage(You said:   e.data);}, false);除了使用self.addEventListener()指定监听函数也可以使用self.onmessage指定。监听函数的参数是一个事件对象它的data属性包含主线程发来的数据。self.postMessage()方法用来向主线程发送消息。根据主线程发来的数据Worker 线程可以调用不同的方法下面是一个例子。self.addEventListener(message, function (e) {  var data  e.data;  switch (data.cmd) {    case start:      self.postMessage(WORKER STARTED:   data.msg);      break;    case stop:      self.postMessage(WORKER STOPPED:   data.msg);      self.close(); // Terminates the worker.      break;    default:      self.postMessage(Unknown command:   data.msg);  };}, false);上面代码中self.close()用于在 Worker 内部关闭自身。2.3 Worker 加载脚本Worker 内部如果要加载其他脚本有一个专门的方法importScripts()。importScripts(script1.js); 该方法可以同时加载多个脚本。importScripts(script1.js, script2.js); 2.4 错误处理主线程可以监听 Worker 是否发生错误。如果发生错误Worker 会触发主线程的error事件。worker.onerror(function (event) {  console.log([    ERROR: Line , e.lineno,  in , e.filename, : , e.message  ].join());}); // 或者worker.addEventListener(error, function (event) {  // ...});2.5 关闭 Worker使用完毕为了节省系统资源必须关闭 Worker。// 主线程worker.terminate(); // Worker 线程self.close();三、数据通信前面说过主线程与 Worker 之间的通信内容可以是文本也可以是对象。需要注意的是这种通信是拷贝关系即是传值而不是传址Worker 对通信内容的修改不会影响到主线程。事实上浏览器内部的运行机制是先将通信内容串行化然后把串行化后的字符串发给 Worker后者再将它还原。主线程与 Worker 之间也可以交换二进制数据比如 File、Blob、ArrayBuffer 等类型也可以在线程之间发送。下面是一个例子。// 主线程var uInt8Array  new Uint8Array(new ArrayBuffer(10));for (var i  0; i  uInt8Array.length; i) {  uInt8Array[i]  i * 2; // [0, 2, 4, 6, 8,...]}worker.postMessage(uInt8Array); // Worker 线程self.onmessage  function (e) {  var uInt8Array  e.data;  postMessage(Inside worker.js: uInt8Array.toString()   uInt8Array.toString());  postMessage(Inside worker.js: uInt8Array.byteLength   uInt8Array.byteLength);};但是拷贝方式发送二进制数据会造成性能问题。比如主线程向 Worker 发送一个 500MB 文件默认情况下浏览器会生成一个原文件的拷贝。为了解决这个问题JavaScript 允许主线程把二进制数据直接转移给子线程但是一旦转移主线程就无法再使用这些二进制数据了这是为了防止出现多个线程同时修改数据的麻烦局面。这种转移数据的方法叫做Transferable Objects。这使得主线程可以快速把数据交给 Worker对于影像处理、声音处理、3D 运算等就非常方便了不会产生性能负担。如果要直接转移数据的控制权就要使用下面的写法。// Transferable Objects 格式worker.postMessage(arrayBuffer, [arrayBuffer]); // 例子var ab  new ArrayBuffer(1);worker.postMessage(ab, [ab]); 四、同页面的 Web Worker通常情况下Worker 载入的是一个单独的 JavaScript 脚本文件但是也可以载入与主线程在同一个网页的代码。!DOCTYPE html  body    script idworker typeapp/worker      addEventListener(message, function () {        postMessage(some message);      }, false);    /script  /body/html上面是一段嵌入网页的脚本注意必须指定script标签的type属性是一个浏览器不认识的值上例是app/worker。然后读取这一段嵌入页面的脚本用 Worker 来处理。var blob  new Blob([document.querySelector(#worker).textContent]);var url  window.URL.createObjectURL(blob);var worker  new Worker(url); worker.onmessage  function (e) {  // e.data some message};上面代码中先将嵌入网页的脚本代码转成一个二进制对象然后为这个二进制对象生成 URL再让 Worker 加载这个 URL。这样就做到了主线程和 Worker 的代码都在同一个网页上面。五、实例Worker 线程完成轮询有时浏览器需要轮询服务器状态以便第一时间得知状态改变。这个工作可以放在 Worker 里面。function createWorker(f) {  var blob  new Blob([f.toString()]);  var url  window.URL.createObjectURL(blob);  var worker  new Worker(url);  return worker;} var pollingWorker  createWorker(function (e) {  var cache;   function compare(new, old) { ... };   setInterval(function () {    fetch(/my-api-endpoint).then(function (res) {      var data  res.json();       if (!compare(data, cache)) {        cache  data;        self.postMessage(data);      }    })  }, 1000)}); pollingWorker.onmessage  function () {  // render data} pollingWorker.postMessage(init);上面代码中Worker 每秒钟轮询一次数据然后跟缓存做比较。如果不一致就说明服务端有了新的变化因此就要通知主线程。六、实例 Worker 新建 WorkerWorker 线程内部还能再新建 Worker 线程。下面的例子是将一个计算密集的任务分配到10个 Worker。主线程代码如下。var worker  new Worker(worker.js);worker.onmessage  function (event) {  document.getElementById(result).textContent  event.data;};Worker 线程代码如下。// worker.js // settingsvar num_workers  10;var items_per_worker  1000000; // start the workersvar result  0;var pending_workers  num_workers;for (var i  0; i  num_workers; i  1) {  var worker  new Worker(core.js);  worker.postMessage(i * items_per_worker);  worker.postMessage((i  1) * items_per_worker);  worker.onmessage  storeResult;} // handle the resultsfunction storeResult(event) {  result  event.data;  pending_workers - 1;  if (pending_workers  0)    postMessage(result); // finished!}上面代码中Worker 线程内部新建了10个 Worker 线程并且依次向这10个 Worker 发送消息告知了计算的起点和终点。计算任务脚本的代码如下。// core.jsvar start;onmessage  getStart;function getStart(event) {  start  event.data;  onmessage  getEnd;} var end;function getEnd(event) {  end  event.data;  onmessage  null;  work();} function work() {  var result  0;  for (var i  start; i  end; i  1) {    // perform some complex calculation here    result  1;  }  postMessage(result);  close();}七、API7.1 主线程浏览器原生提供Worker()构造函数用来供主线程生成 Worker 线程。var myWorker  new Worker(jsUrl, options); Worker()构造函数可以接受两个参数。第一个参数是脚本的网址必须遵守同源政策该参数是必需的且只能加载 JS 脚本否则会报错。第二个参数是配置对象该对象可选。它的一个作用就是指定 Worker 的名称用来区分多个 Worker 线程。// 主线程var myWorker  new Worker(worker.js, { name : myWorker }); // Worker 线程self.name // myWorkerWorker()构造函数返回一个 Worker 线程对象用来供主线程操作 Worker。Worker 线程对象的属性和方法如下。Worker.onerror指定 error 事件的监听函数。Worker.onmessage指定 message 事件的监听函数发送过来的数据在Event.data属性中。Worker.onmessageerror指定 messageerror 事件的监听函数。发送的数据无法序列化成字符串时会触发这个事件。Worker.postMessage()向 Worker 线程发送消息。Worker.terminate()立即终止 Worker 线程。7.2 Worker 线程Web Worker 有自己的全局对象不是主线程的window而是一个专门为 Worker 定制的全局对象。因此定义在window上面的对象和方法不是全部都可以使用。Worker 线程有一些自己的全局属性和方法。self.name Worker 的名字。该属性只读由构造函数指定。self.onmessage指定message事件的监听函数。self.onmessageerror指定 messageerror 事件的监听函数。发送的数据无法序列化成字符串时会触发这个事件。self.close()关闭 Worker 线程。self.postMessage()向产生这个 Worker 线程发送消息。self.importScripts()加载 JS 脚本。完来源www.ruanyifeng.com/blog/2018/07/web-worker.html数据与算法之美用数据解决不可能长按扫码关注
http://www.sadfv.cn/news/280159/

相关文章:

  • 长安公司网站制作如何做网站 百度经验
  • dw网站制作手机软件下载国内好的vps
  • 听小说的网站哪个好html教程网站
  • 中国联通网站备案管理系统广告公司名字大全20000个
  • 狂人站群系统做捕鱼网站电话
  • 做视频网站投入多少网页传奇游戏怎么注销
  • 定制型网站制作价格企业网址一般怎么设置
  • 做音乐网站的目地做医药中间体的外贸网站
  • 如何注销网站域名建立网站
  • wordpress国内视频网站吗网站设计的介绍模板
  • 网站安全保障机制如何做网站建设设计有哪些
  • 网站设计论坛外包网站问些什么问题
  • 东莞人才市场最新招聘信息廊坊seo计费管理
  • 汽车网站的建设方向大连网站快速建设推荐
  • 商务网站设计实训总结网站建设协议附件
  • wordpress改成自己网站wordpress帝国哪个安全
  • 网站换程序301自建网站平台可以实现哪些功能
  • 贵阳做网站公司seo优化网站推广全域营销获客公司
  • 怎么做家政的网站大学生网络营销策划方案书
  • 域名访问网站的知识做电子政务 网站
  • 合肥网站设计建设公司哈尔滨建设工程招标网
  • 免费淘宝客网站建设网页设计实验报告问题讨论
  • 苏州松陵镇哪里做网站漳州本地网
  • 阿卯网站建设wordpress 好用插件
  • 手机网站 qq代码个人展示网站
  • 购物网站后台模板做兼职网站赚钱吗
  • 建设网站公司 昆山网站维护费用明细
  • 专题网站建设工作asp网站伪静态页面
  • 06628 网页制作与网站开发做谷歌推广对网站的要求
  • 做详情图的网站wordpress添加修改记录