在android真机中wx.createWorker()从子线程接收数据为空
发布于 7 年前 作者 jie31 1366 次浏览 来自 问答

在主线程中iOS真机中可以从子线拿到数据,但是在android真机中却没有从子线程中收到要处理的数据。


添加后,目录结构如下:

(1)在主线程的代码 app.js 中初始化 Worker

// 创建新进程

var worker = wx.createWorker(‘workers/request/index.js’) // 文件名指定 worker 的入口文件路径,绝对路径

// 向子进程发送数据

worker.postMessage({

 msg: value// value是外界传过来的城市名数组,数组元素是对象如:{cityName: “”, stationName: “贵阳”}

})

// 从子线程接收处理结果并展示

worker.onMessage(function (res) {

  console.log(res)

  that.globalData.pySeg = res.msg;

})

(2)workers/request/index.js 编写 Worker 响应代码

ar utils = require(’/utils’);

var pySegValue = [];

// 在 Worker 线程执行上下文会全局暴露一个 `worker` 对象,直接调用 worker.onMeesage/postMessage 即可

worker.onMessage(function (res) {

 if(pySegValue.length <=0){

   pySegValue = utils.pySegSort(res.msg);// 调用城市排序算法

   //向主线程发送数据

   worker.postMessage({

     msg: pySegValue

   })

 }

});

(3)workers/request/utils.js 编写 Worker 响应代码

// 城市排序

function pySegSort(arr) {

 if (!String.prototype.localeCompare)

   return null;

 var letters = “ABCDEFGHJKLMNOPQRSTWXYZ”.split(’’);

 console.log(letters);

 var zh = “阿八嚓哒妸发旮哈讥咔垃麻拏噢妑七呥扨它穵夕丫帀”.split(’’);

 console.log(zh);

 var segs = [];

 var curr;

 letters.forEach(function (item, i) {

   console.log(i);

   curr = { isUp: false, i: i, letter: item, data: [] };

   arr.forEach(function (item2) {

     if ((!zh[i] || zh[i].localeCompare(item2.stationName, “zh”) <= 0) && item2.stationName.localeCompare(zh[i + 1], “zh”) == -1) {

       curr.data.push(item2);

     }

   });

   if (curr.data.length) {

     segs.push(curr);

     curr.data.sort(function (a, b) {

       return a.stationName.localeCompare(b, “zh”);

     });

   }

 });

 return segs;

}

module.exports = {

 pySegSort: pySegSort,

}

报错信息:

6 回复

应该是创建线程对象不成功,你们官方可以在在android真机中测试。

这里定位到的问题是 String.prototype.localeCompare 方法在各平台的差异上。

‘阿’.localeCompare(‘纳雍’, ‘zh-Hans-CN’)

同样的这句代码,在iOS和工具上输出 -1,而安卓上输出 6028。原因是不同平台OS的排序算法不一样

http://www.w3school.com.cn/js/jsref_localeCompare.asp

这里需要自己考虑怎么做跨平台兼容了。

var worker = wx.createWorker(‘workers/request/index.js’) // 文件名指定 worker 的入口文件路径,绝对路径

wechatide://minicode/jgNUyMmX6lYo

回到顶部