当收到最后一份数据时,请调用您的计算最终解决方案的函数:
var data = [];
function createWorker(i) {
var v = new Worker('js/worker.js');
v.postMessage(i);
v.onmessage = function(event){
data.push(event.data);
if (data.length === 100) {
computeFinalSolution();
}
};
}
for(var i = 0; i < 100; i++) {
createWorker(i);
}
显然,根据你的考虑对其进行参数化,但是createWorker
除了i
之外目前没有参数化,因此...
请注意,data
中的条目可能不按顺序排列。当工作需要更多处理或线程调度的各种偶然情况发生时,i == 0
的worker可能在 i == 1 的worker完成之后才能完成。如果您需要以有序的方式进行操作,则很容易完成,但我们必须添加一个计数器(或在每次完成时循环遍历data
进行检查):
var data = [];
var dataReceived = 0;
function createWorker(i) {
var v = new Worker('js/worker.js');
v.postMessage(i);
v.onmessage = function(event){
data[i] = event.data;
if (++dataReceived === 100) {
computeFinalSolution();
}
};
}
for(var i = 0; i < 100; i++) {
createWorker(i);
}
如果您想要更现代、更灵活的方法,请考虑使用 Promise。自 ES2015(也称为 ES6)起,Promise 已成为 JavaScript 的本地功能,并可用于旧版 JavaScript 引擎中进行填充:
function createWorker(i) {
return new Promise(function(resolve) {
var v = new Worker('js/worker.js');
v.postMessage(i);
v.onmessage = function(event){
resolve(event.data);
};
});
}
var promises = [];
for(var i = 0; i < 100; i++) {
promises.push(createWorker(i));
}
Promise.all(promises)
.then(function(data) {
});
这也有一个优点,即data
将按顺序包含结果,我们不必自己处理。
上述与您当前的代码一致,似乎没有任何错误处理措施。但通常最好进行错误处理:
function createWorker(i) {
return new Promise(function(resolve, reject) {
var v = new Worker('js/worker.js');
v.postMessage(i);
v.onmessage = function(event){
resolve(event.data);
};
v.onerror = reject;
v.onerror = function(event) {
reject(event.error);
};
});
}
var promises = [];
for(var i = 0; i < 100; i++) {
promises.push(createWorker(i));
}
Promise.all(promises)
.then(function(data) {
})
.catch(function(error) {
});