【发布时间】:2020-01-27 23:02:44
【问题描述】:
下午好,我遇到了以下问题,我正在尝试遍历带有子目录的列表,以将这些子目录的路由添加到数组(存储库)中,这是我的代码:
for (n=0; n<=pendingRepos.length; n++){
subruta = pendingRepos[pendingRepos.length -1]
pendingRepos.pop()
c.list(subruta, function(err, sublist) {
if (sublist.length != 0){
for (g=0; g < sublist.length; g++){
if (sublist[g].type === 'd' ){
repositories.push(subruta+'/'+sublist[g].name)
pendingRepos.push(subruta+'/'+sublist[g].name)
}
else {files.push(subruta+'/'+sublist[g].name)}
}
}
});
}
例如,当为我的数组 pendingRepos 启动循环时,其结构如下:
pendingRepos = ['/ dir1 / dir2', / dir3 / dir4 ']
循环正确执行了 2 次并删除了最后一个元素,但在另一个循环向数组添加另一个“最后一个”元素时,第一个 for 循环没有考虑到它。 我知道在我添加更多元素之前已经评估了条件,这是正确的吗?如何避免?
【问题讨论】:
-
您正在以一种奇怪的方式遍历pendingRepos,同时还使用
.pop()和.push()在循环内修改它。这似乎不是迭代该数组的可靠方法。 -
另外,
c.list()似乎是非阻塞和异步的,因此您尝试并行运行一堆c.list()操作,并且所有操作都将在主for循环之后完成。这是完全不可预测的。我准备了一个解决这两个问题的答案,但后来决定我真的不知道你在迭代循环内正在修改的东西时试图用顶级循环迭代做什么。这对我来说毫无意义。 -
c.list()中的c是什么库?你能给它npm链接吗? -
@TheHansinator npmjs.com/package/ftp 我正在使用这个模块
-
@FrancoGaluzzi 那么它是异步的(因为它正在联系 FTP 服务器)。我将在考虑到这一点的情况下完成对 JavaScript 的回答,但我会补充一点,如果您只是编写一个 shell 脚本而不是程序的一部分(这似乎很可能,因为您正在设置全局变量这个地方),我强烈建议使用类似 Powershell 的东西,因为与 JavaScript 不同,它可以让你编写命令等待服务器执行它的操作并回复你。
标签: javascript node.js loops