【问题标题】:Nested loop Synchronous or Asynchronous?嵌套循环同步还是异步?
【发布时间】:2020-01-17 00:43:02
【问题描述】:

我有一个名为noNCreatedResources 的数组。我想对数组的每个项目进行一些操作,并将项目推入createdResources 数组并从noNCreatedResources 数组中删除该项目并继续这样做,直到noNCreatedResources 为空。为此,我编写了 CreateResources 函数,包括嵌套的 while 和 for 循环。它工作正常,但我意识到它不能同步工作。例如:它必须在 while 循环中迭代两次,但迭代 4 次,我不知道为什么。 我想我不明白 node.js 的异步/等待/非阻塞概念的概念。任何机构都可以帮助我了解问题所在吗?

CreateResources = async () => {
  while (this.noNCreatedResources.length > 0) {
    for (let index = 0; index < this.noNCreatedResources.length; index++) {
      if (this.resourceHasCreatedDependencies(this.noNCreatedResources[index])) {
        const resourceModel = this.someOperation(this.noNCreatedResources[index]);
        this.createdResources.push(resourceModel);
        this.noNCreatedResources.splice(index, 1);
      }
    }
  }
}

【问题讨论】:

    标签: node.js asynchronous async-await nested nonblocking


    【解决方案1】:

    首先,您没有在函数中执行任何异步操作,因此您可以从函数中删除 async 关键字。由于您没有做任何异步操作,因此您的问题与它无关。这更像是 IMO 的实施问题。

    您的while 循环对于您要实现的目标毫无用处。另外,你的逻辑是错误的!

    示例:以下代码将输出135

    let x = [1,2,3,4,5];
    for(let i = 0; i < x.length; i++) {
      console.log(x[i]);
      x.splice(i, 1);
    }
    

    我认为您不需要从数组中删除项目即可达到预期结果。如果您需要重置阵列,那么最后您可以这样做x = [] 来重置阵列。

    【讨论】:

      【解决方案2】:

      您遇到的问题不是由于异步调用。实际上,您的代码是完全同步的。尝试查看“noNCreatedResources”的创建/更新位置。异步调用发生在您发送 http 请求、读取文件等时,换句话说,在您的代码中不会发生的操作。它允许代码继续运行,不会阻塞下一个函数调用,并且当 promise 完成时,调用回调函数。

      【讨论】:

        猜你喜欢
        • 2015-06-05
        • 1970-01-01
        • 2019-07-21
        • 2017-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多