【问题标题】:next loop must start only after one gets completed in node js 8 [duplicate]下一个循环必须在节点 js 8 中完成一个循环后才开始 [重复]
【发布时间】:2021-02-03 17:18:45
【问题描述】:

当大数据处理不正常时如何逐个执行for循环我想使用node.js开发这样的相同逻辑。

result1是这样的

[
  {
    "FNODE_ID": "30015",
    "END_TIME": "2021-02-03",
    "START_TIME": 57,
    "C1": "[2206.888,2206.859,0.028999999999996362]",
    "TOTAL": 6
  },
  {
    "FNODE_ID": "30015",
    "END_TIME": "2021-02-03",
    "START_TIME": 56,
    "C1": "[2206.854,2206.815,0.03899999999975989]",
    "TOTAL": 8
  },
  {
    "FNODE_ID": "30015",
    "END_TIME": "2021-02-03",
    "START_TIME": 55,
    "C1": "[2206.809,2206.766,0.04300000000012005]",
    "TOTAL": 9
  },
  {
    "FNODE_ID": "30015",
    "END_TIME": "2021-02-03",
    "START_TIME": 54,
    "C1": "[2206.76,2206.728,0.032000000000152795]",
    "TOTAL": 7
  }
]

这是嵌套的for循环

 var fvalue1 = {}
     for (var j = 0; j < result1.length; j++) {
          for (var node in nodeParameterObj) {
            if (result1[j]['FNODE_ID'] == node) {
              if ('undefined' == typeof fvalue1[node]) {
                fvalue1[node] = {}
              }
              for (var parameter in nodeParameterObj[node]) {
                if ('undefined' == typeof fvalue1[node][parameter]) {
                  fvalue1[node][parameter] = {}
                }
                if (result1[j][nodeParameterObj[node][parameter]] != null) {
                  var a = JSON.parse(result1[j][nodeParameterObj[node][parameter]])
                  a.push(0, 0, 0);
                  a.push(result1[j]['TOTAL']);
                  fvalue1[node][parameter] = a.toString();
                }
              }
            }
          }     
        }

最终输出是

{
  "30015": {
    "C1": {
      "54": "2206.76,2206.728,0.032000000000152795,0,0,0,7",
      "55": "2206.809,2206.766,0.04300000000012005,0,0,0,9",
      "56": "2206.854,2206.815,0.03899999999975989,0,0,0,8",
      "57": "2206.904,2206.859,0.04500000000007276,0,0,0,9"
    }
  }
}

但它不处理大量数据 我正在尝试这样

  var processResult = function(callback){
            async.forEach(result1, function (item, callback){ 
              console.log(item);      
              callback();       
          }, function(err) {
              console.log('iterating done');
          });        
        }
processResult(function(err, users) {
      resolve(fvalue1); 
  });
  

但是控制台不打印任何值

【问题讨论】:

  • 所有这些代码都是同步的,所以不清楚你想用你的循环做什么不同的事情。请说明您究竟需要什么帮助?
  • 现在检查更新的问题
  • 如果您立即同步调用callback()async.forEach 根本不是异步的。

标签: javascript node.js asynchronous


【解决方案1】:

由于 javascript 是单线程运行的,复杂的同步代码会阻止所有其他代码(在同一节点进程内)运行。解决此问题的一种简单方法是在超时内运行代码块。 setTimeout 是一个异步函数,这将给事件循环一个更改以检查其他异步请求来处理。您可以使用 0 毫秒的超时,如果需要,它仍然会产生中断。

const fvalue1 = {}
for (var j = 0; j < result1.length; j++) {
  for (var node in nodeParameterObj) {
    setTimeout(function () {
      if (result1[j]['FNODE_ID'] == node) {
        if ('undefined' == typeof fvalue1[node]) {
          fvalue1[node] = {}
        }
        for (const parameter in nodeParameterObj[node]) {
          if ('undefined' == typeof fvalue1[node][parameter]) {
            fvalue1[node][parameter] = {}
          }
          if (result1[j][nodeParameterObj[node][parameter]] != null) {
            const a = JSON.parse(result1[j][nodeParameterObj[node][parameter]])
            a.push(0, 0, 0)
            a.push(result1[j]['TOTAL'])
            fvalue1[node][parameter] = a.toString()
          }
        }
      }
    }, 0)
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 2022-08-14
    • 2019-03-06
    • 2022-10-12
    相关资源
    最近更新 更多