ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

js中调用worker工程化结构

2020-11-02 09:33:50  阅读:261  来源: 互联网

标签:cmd worker js var gzip 工程化 data payload


仿照gaia-gzip的结构进行分析:

---gzip
 |---gzip.js          # gzip主线程引入部分
 |---gzip_worker.js   # worker工作者线程
 |---gzip.min.js      # gzip的js版本库

内容:

gzip.js

/* exported Gzip */
'use strict';

var Gzip = {
  // worker的绝对路径
  WORKER_URL: '/shared/js/gzip/gzip_worker.js',
  // Gzip仅向外提供一个compress执行函数
  compress: function(payload) {
    return new Promise((resolve, reject) => {
      var worker = new Worker(this.WORKER_URL);
      // 加载失败延时报错保护,会主动终止worker
      // Protect against the worker failing for whatever reason.
      var workerTimeout = setTimeout(function() {
        worker.terminate();
        reject('Failed to compress: gzip worker did not respond.');
      }, 10000);
      // 通信监听 -- 收到消息->清除延时,终止线程->向外抛出数据/没有结果向外抛错
      worker.onmessage = function(msg) {
        clearTimeout(workerTimeout);
        worker.terminate();

        var data = msg.data;
        if (data.returnResult) {
          resolve(data.gzipData);
        }
        else {
          reject('Failed to compress: ' + data.error);
        }
      };
      // 向worker通信,传递两个参:cmd执行命令,payload工作任务开销
      worker.postMessage({
        cmd: 'gzip',
        payload: payload
      });
    });
  }
};

gzip_worker.js

/* global Zlib */
'use strict';
// 外部库在worker中进行引入
importScripts('gzip.min.js');
// 只有一个通信监听
self.onmessage = function(message) {
  // 取工作指令
  var cmd = message.data.cmd;

  if (cmd === 'gzip') {
    // 将传进来的开销任务字符串转为Uint8Array格式,供gzip使用
    // gzip function requires Uint8Array
    var textEncoder = new TextEncoder('utf8');
    var payload = message.data.payload;
    var uint8Data = textEncoder.encode(payload);

    try {
      var gzip = new Zlib.Gzip(uint8Data);
      var compressed = gzip.compress();
      // 任务执行成功与否用returnResult进行指示,并返回不同的包裹内容
      postMessage({returnResult: true, gzipData: compressed});
    }
    catch(e) {
      postMessage({returnResult: false, error: e});
    }
  } else {
    console.warn('GzipWorker, unsupported cmd:', cmd);
  }
};

结构抽象

/******************************mainjs********************************/
/* 暴露包名 */
'use strict';
var 包名 = {
  WORKER_URL: worker地址,
  执行任务: function(payload) {
    return new Promise((resolve, reject) => {
      var worker = new Worker(this.WORKER_URL);
      // 加载失败延时报错保护,会主动终止worker
      var workerTimeout = setTimeout(function() {
        worker.terminate();
        reject(执行任务失败原因);
      }, 10000);
      // 通信监听 -- 收到消息->清除延时,终止线程->向外抛出数据/没有结果向外抛错
      worker.onmessage = function(msg) {
        clearTimeout(workerTimeout);
        worker.terminate();

        var data = msg.data;
        // 自定义data内数据结构
        if (data.returnResult) {
          resolve(data.gzipData);
        }
        else {
          reject(执行任务失败 + data.error);
        }
      };
      // 向worker通信,传递两个参:cmd执行命令,payload工作任务开销
      worker.postMessage({
        cmd: 执行命令,
        payload: payload
      });
    });
  }
};
/*****************************workerjs*******************************/
/* 声明依赖库 */
'use strict';
// 外部库在worker中进行引入
importScripts(库地址);
// 只有一个通信监听
self.onmessage = function(message) {
  // 取工作指令
  var cmd = message.data.cmd;

  if (cmd === 工作指令) {
    try {
      var 库调用结果 = 库调用指令(message.data.payload);
      // 任务执行成功与否用returnResult进行指示,并返回不同的包裹内容
      postMessage({returnResult: true, xxxData: 库调用结果});
    }
    catch(e) {
      postMessage({returnResult: false, error: e});
    }
  } else {
    console.warn(不支持命令警告);
  }
};

标签:cmd,worker,js,var,gzip,工程化,data,payload
来源: https://www.cnblogs.com/hencins/p/13912842.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有