【问题标题】:Nodejs Iterate through array and write to fileNodejs遍历数组并写入文件
【发布时间】:2016-08-29 21:16:37
【问题描述】:

我有一个包含大约 20K 条记录的数组。每条记录都包含一个加密列,其余的则不包含。当我使用 for 循环遍历每条记录并调用解密回调函数时,结果稍后会出现,因此解密的值始终为空。解密后,我想将整行写入 excel 工作表并在将数组中的每个元素写入文件后关闭文件。最好的方法是什么?

var myArray = [{name:'ABC',accountNumber:'hsjdhsj%^==='},{name:'BCD',accountNumber:'hsjdhsj%^==='}];
for(var i=0; i< myArray.length; i++){
   myArray[i].decryptAccNumber = decrypt(myArray[i].accountNumber);  // async way to decrypt it 
   res.write(myArray[i]); //Writing to excel file
}
res.close();

现在,该文件只包含姓名、帐号,但不包含解密的帐号。

关于如何处理同步和异步混合的要求的任何建议

--------- 已编辑 ------------

var callbackCount = myArray.length;
for(var i=0; i< myArray.length; i++)
{
   decrypt(myArray[i].accountNumber,function(decrypted){  
     myArray[i].decryptAccNumber=decrypted;
     res.write(myArray[i]); //Writing to excel file
     callbackCount--;
     if(callbackCount === 0){
       res.close();
     }
  });
}

这是https://gist.github.com/Grety/236c41acf006475f0eee768b64e4a7bc 给出的解决方案 甚至,我也想到了相同的解决方案,但我个人不喜欢这个解决方案,因为它看起来可以解决。 除了使用像callbackCounter这样的临时变量之外,还有其他更好的方法来解决这个问题吗?这是我要发布的确切问题。感谢 Kyrylo Slatin 发布带有确切问题的 GIT 网址。

【问题讨论】:

  • 尝试 async.forEach
  • 你应该使所有的异步。没有办法“稍后”将几个字节正确地写入文件。您等待解密完成。当它完成时(不清楚,因为在要点中你没有提供对decrypt的回调)你写入文件解密数据和同步获得的数据
  • 为此写一个回调函数或者先全部解密再写入文件
  • 我们如何知道它是行尾和呼叫关闭?是否有全局变量来保持跟踪计数并在回调中关闭它们?有没有这样的例子?

标签: node.js asynchronous


【解决方案1】:

将回调传递给您的解密函数。然后你可以在解密函数完成后写你的行。 Here is an example

【讨论】:

    【解决方案2】:

    使用 asyn.foreach 可以轻松解决您的问题。 它将为数组中的每个元素异步调用您的解密,最后您可以获得结果。/

    参考这个 https://github.com/caolan/async

    【讨论】:

      【解决方案3】:

      这样写回调函数希望对你有帮助

        for(var i=0; i< myArray.length; i++)
        {
          decrypt(myArray[i].accountNumber,function(decrypted){  
          myArray[i].decryptAccNumber=decrypted;
         res.write(myArray[i]); //Writing to excel file
          });
      
        }
        res.close()
      

      你的解密函数会是这样的

        decrypt(number,callback){
         var decrypted= // you code of decryption
      
           callback(decrypted)
        }
      

      【讨论】:

      • 什么时候应该在你的代码中执行res.close()
      • 在回调函数之后我编辑了它@KirillSlatin
      • 就在所有项目被解密之前...鉴于decrypt 确实是异步的。所以for( 将在一个 js 滴答声中执行,在文件关闭之后,在下一个滴答声中将调用回调,尝试写入刚刚关闭的文件
      • 除了代码res.close()之外,当前被放置在inside循环中
      • 感谢@KirillSlatin 的修正。现在可以了吗?
      猜你喜欢
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多