【问题标题】:Node Synchronous loops节点同步循环
【发布时间】:2019-08-18 05:41:31
【问题描述】:

我有一个函数。

function async extractTars (tarList) {
  try {
    for (let i = 0; i < tarList.length; i ++) {
      // I need this loop to be sync but it isn't hitting the next iteration
      return new Promise((resolve, reject) => {
        fs.createReadStream(`${PATHS.TAR}/${tarList[i]}`)
          .pipe(tar.extract(PATHS.GZ))
          .on('error', err => reject(err))
          .on('finish', () => resolve())
      })
    }
    // What is the correct way to resolve this async fn? Should i just return or will it resolve anyway after the loop?
  } catch (e) {
    // handle error
  }
}

由于某种原因,它永远不会到达循环的下一次迭代。我在这里想念什么?我怎样才能使这些类型的循环同步。在这个特定的项目中,我有很多循环需要在下一个之前完成。我已经尝试了几种我在这里看到的方法,但我显然遗漏了一些东西。

任何帮助将不胜感激!

【问题讨论】:

  • 因为是返回值,把return语句换成await就行了

标签: node.js loops asynchronous


【解决方案1】:

您正在使用return,这就是您没有进行下一次迭代的原因,请改用await 等到承诺完成后再进行下一次迭代。

for 内的return 将停止循环并结束返回new Promise 的函数

function async extractTars (tarList) {
  try {
    for (let i = 0; i < tarList.length; i ++) {
      // I need this loop to be sync but it isn't hitting the next iteration
      await new Promise((resolve, reject) => {
        fs.createReadStream(`${PATHS.TAR}/${tarList[i]}`)
          .pipe(tar.extract(PATHS.GZ))
          .on('error', err => reject(err))
          .on('finish', () => resolve())
      })
    }
    // What is the correct way to resolve this async fn? Should i just return or will it resolve anyway after the loop?
  } catch (e) {
    // handle error
  }
}

只是为了澄清:

我需要同步这个循环,但它没有达到下一次迭代

当使用async/await 时,该循环不会同步,它看起来像是同步的,但您不能使异步代码同步。而createReadStream 是异步的。

关于:

解决此异步 fn 的正确方法是什么?我应该只是 return 还是会在循环后解决?

当所有迭代都完成或抛出错误(因为您正在捕获它而不是拒绝),这意味着您读取了tarList 中的所有文件,该函数将被解析。由于您没有返回任何内容,undefined 将是解析后的值。

来自MDN

当在函数体中使用 return 语句时,函数的执行将停止。如果指定,则将给定值返回给函数调用者。例如,以下函数返回其参数 x 的平方,其中 x 是一个数字。

【讨论】:

  • 谢谢!这很有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 2019-03-15
相关资源
最近更新 更多