嵌套循环是同步还是异步?

问题描述 投票:0回答:2

我有一个名为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
2个回答
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 = []即可重置阵列。


0
投票

您遇到的问题不是由于异步调用。实际上,您的代码是完全同步的。尝试看看在哪里创建/更新了“ noNCreatedResources”。当您发送http请求,读取文件等时发生异步调用,换句话说,代码内未发生的操作。它允许代码继续运行,而不阻止下一个函数调用,并且当诺言实现时,将调用回调函数。

© www.soinside.com 2019 - 2024. All rights reserved.