【问题标题】:Node.js synchronous loopNode.js 同步循环
【发布时间】:2015-09-13 15:51:55
【问题描述】:

我是 node.js 的新手,我想知道是否可以在循环中同步迭代。假设在 for 循环中我调用了一个阻塞函数(读取、写入)并且我希望 for 同步执行(等待第一次迭代完成,然后执行第二次迭代,...)?我看过一些关于异步模块的教程,但没有人涉及这个问题。

【问题讨论】:

  • for 同步,如果你只在 for 块中调用阻塞函数,整个循环也将是同步的。我真的没有给你问题...
  • 为什么循环默认不同步?
  • 这需要更多信息。
  • 如果在每次迭代中我读取了一大组数据,那么 node.js 将执行以下操作:运行第一次读取尝试,然后它不等待完成,并运行第二次读取 (迭代2)。我希望在运行第一次阅读后等待它完成,然后运行第二次,依此类推。
  • @SebiSebi 如果您的for 循环正在迭代一个数组,您应该查看async#eachSeries

标签: javascript node.js asynchronous


【解决方案1】:

您不应该为此使用 for 循环。 for 循环将同时触发每个异步函数,这显然不是您想要的。您应该创建自己的系统来调用这些。试试这样的:

  1. 您需要一个数组来保存您想要点击的所有 URL
  2. 您需要创建一个函数来调用列表中的第一个 URL 并等待响应
  3. 在此调用的回调函数中,一旦所有异步工作完成,调用同一个函数重新启动进程,直到它超出 URL 的命中范围

应该看起来像这样:

var urls = new Array("google.com", "youtube.com", "stackoverflow.com");

function callFirstInArray() {
   var url = urls.shift(); //removes the first from the array, and stores in variable 'url'

   //do ajax work, and set callback function:
   $.ajax(/*do stuff with the url variable*/, function () { 
      if (urls.length > 0) {   //callback
         callFirstInArray();
      };
   });
};

你的可能与我在这里描述的不完全一样,但它应该使用与之类似的概念。

注意:您可能需要一个额外的函数范围来保护您的原始 URL 数组,因为 .shift() 会改变原始数组

【讨论】:

  • 好的。是否可以使用异步处理这种情况?
  • 你这是什么意思?此解决方案处理使用异步带来的复杂性
  • 抱歉,我不熟悉你说的异步模块。
  • 我发现其他帖子有人说这种解决方案会导致堆栈溢出。它适用于一个小数组,但对于数组中的数百万个元素,它会破坏运行时。示例:stackoverflow.com/questions/15902211/…
【解决方案2】:

您提到您正在读写文件,您使用的是fs.readFilefs.writeFile吗?这些是异步方法,您需要在回调中一个接一个地调用。

如果您确实想使用循环,请查看这些方法的同步版本 fs.readFileSyncfs.writeFileSync

【讨论】:

    猜你喜欢
    • 2016-01-24
    • 1970-01-01
    • 2014-07-04
    • 2015-04-11
    • 1970-01-01
    • 2018-04-18
    • 2015-02-27
    • 2017-06-16
    • 1970-01-01
    相关资源
    最近更新 更多