我有一个名为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);
}
}
}
}
首先,您在函数中没有执行任何异步操作,因此可以从函数中删除async
关键字。由于您没有执行任何异步操作,因此您的问题与此无关。这更多是IMO的一个实施问题。
您的while
循环对于您要实现的目标没有用。另外,您的逻辑已被破坏!
示例:以下代码将输出1
,3
和5
。
let x = [1,2,3,4,5];
for(let i = 0; i < x.length; i++) {
console.log(x[i]);
x.splice(i, 1);
}
我认为您不需要从数组中删除项目即可达到预期的结果。如果您需要重置阵列,那么最后只需执行此x = []
即可重置阵列。
您遇到的问题不是由于异步调用。实际上,您的代码是完全同步的。尝试看看在哪里创建/更新了“ noNCreatedResources”。当您发送http请求,读取文件等时发生异步调用,换句话说,代码内未发生的操作。它允许代码继续运行,而不阻止下一个函数调用,并且当诺言实现时,将调用回调函数。