迭代数组中的每个对象,并用结果填充数组的每个元素。异步

时间:2016-01-02 16:34:42

标签: arrays json node.js loops asynchronous

我需要有关数组异步迭代功能的帮助。我在 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(),并最终绑定到一个对象。

我尝试在系列函数中使用异步每个地图来解决所有问题,但是结果没什么明智的。可能是堆栈溢出社区可以找到一些智能解决方案。请帮忙。

1 个答案:

答案 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;

  });