我需要有关数组异步迭代功能的帮助。我在 nodejs 中使用 node-opcua 库。有功能 session.browse (nodeId,结果) 现在代码看起来像:
NodesTree = {
"NodesTree":{
"name":"SYM:",
"subf":[]
}
};
the_session.browse("ns=1;s=SYM:", function(err, browse_result){
if(!err) {
var buf = [];
browse_result[0].references.forEach(function(reference) {
if (reference1.browseName.namespaceIndex > 1) {
buf.push(reference);
}
});
NodesTree.subf = buf;
}
});
结果我获得了SYM的引用:文件夹示例:
[{"referenceTypeId":"ns=0;i=35","isForward":true,"nodeId":"ns=6;s=S71500ET200MP station_1","browseName":{"namespaceIndex":6,"name":"S71500ET200MP station_1"},"displayName":{"text":"S71500ET200MP station_1","locale":"en"},"nodeClass":"Object","typeDefinition":"ns=0;i=61"}]
我在opc中有Nodes结构,如下所示:
->SYM:
-->PLC
--->PLC_name
---->global_tag <variable>
---->global_tag1 <variable>
---->block
------>blok_tag1 <variable>
------>block_tag2 <variable>
任务是将一个完整的JSON对象作为树进行进一步使用。
逻辑是:对于引用数组中的每个元素,获取 nodeId值并浏览元素的引用并指定为元素。 subf =参考。
最终结果如下:
NodesTree = {
"NodesTree":{
"name":"SYM:",
"subf":[
{attributes of PCL structure got by **browse**() + subf:[{ attributes of PLC_name by browse(), subf:
[{....and here again attributes and subf] }, {if no subf just assign subf; [] }]
]
}
};
因此需要为每个引用调用 session.browse(),并最终绑定到一个对象。
我尝试在系列函数中使用异步库每个和地图来解决所有问题,但是结果没什么明智的。可能是堆栈溢出社区可以找到一些智能解决方案。请帮忙。
答案 0 :(得分:0)
我不熟悉node-opcua
但是假设session.browse()
也是异步的。那么这样的事可能有用吗?
var async = require('async');
async.map(buf,
function(reference, callback) {
session.browse(reference.nodeId, function (err, result) {
callback(err, result);
});
}, function(err, results) {
// results is now an array of all single results
NodesTree.subf = results;
});