在主线程中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,
}
报错信息:
这里定位到的问题是 String.prototype.localeCompare 方法在各平台的差异上。
‘阿’.localeCompare(‘纳雍’, ‘zh-Hans-CN’)
同样的这句代码,在iOS和工具上输出 -1,而安卓上输出 6028。原因是不同平台OS的排序算法不一样
http://www.w3school.com.cn/js/jsref_localeCompare.asp
这里需要自己考虑怎么做跨平台兼容了。