我目前正在学习网络工作人员,我需要在工作人员中进行一些计算,这不会阻碍浏览器中的流程。
目前我有一个 ajax 调用,它返回一个包含多个数据 block 的 xml 数据结构,如下所示:
<data>
<sub1>
<sub2>
<sub3>
</data>
<data>
<sub1>
<sub2>
<sub3>
</data>
然后我从这个数据结构创建一个对象,如下所示:
var node = $(xml).find(data);
然后我将对象字符串化以传输给工作人员,如下所示:
var toPass = JSON.stringify(node);
然后我将此变量 (toPass) 发送给工作人员,如下所示:
worker.postMessage(toPass);
到目前为止,所有这些工作正常,我遇到的问题是尝试访问工作人员内的数据。
所以在 worker 中我这样做:
onmessage = function (oEvent) {
var node = JSON.parse(oEvent.data);
for(var = 0; i < node.length; i++){
var sub1 = node[i].find('sub1').text();
}
};
我面临的问题是尝试访问“sub1”、“sub2”和“sub3”数据。
我可以看到我正在尝试错误地访问数据,因为我使用的是 XML.find 方法, 我觉得在将数据解析为 JSON 对象后,我对数据感到困惑。
有人可以告诉我如何正确访问“node[i]”中的数据元素吗?
最诚挚的问候。
最佳答案
好的,
我想这里学到的教训是永远不要假设任何事情。
当我这样做时: var node = $(xml).find('data');
我认为它返回了一个对象数组,其中包含每个标签内的所有子标签,但是我错了,我返回了一个数组(长度正确),但每个数组都包含空对象,这就是为什么我无法访问网络工作人员中的数据。
为了解决这个问题,在我将数据请求发送给工作人员之前,我首先像这样循环 xml 文件:
var node = $(xml).find('data');
var nodeArray = [];
for (var i=0; i<node.length; i++){
var sub1 = $(node[i]).find('sub1').text();
var sub2 = $(node[i]).find('sub2').text();
var sub3 = $(node[i]).find('sub3').text();
var tojsonObj = {'sub1':sub1,'sub2':sub2,'sub3':sub3};
nodeArray.push(tojsonObj);
}
worker.postMessage(nodeArray);
这样我不需要解析任何东西,因为工作人员可以接受数组(仅在 ff 中测试)
要在工作人员中访问所有这些数据,我这样做:
onmessage = function (oEvent) {
var nodeArray = oEvent.data;
for(var i = 0; i < nodeArray.length; i++){
var sub1 = nodeArray[i].sub1;
var sub2 = nodeArray[i].sub2;
var sub3 = nodeArray[i].sub3;
}
};
现在我可以访问数据了,我可以在循环内用它做我喜欢做的事情,这样我就可以在浏览器中释放一些处理时间。
现在我只需要处理它并弄清楚如何返回它。
关于javascript - 如何从网络 worker 内部访问对象元素数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20475133/