gpt4 book ai didi

node.js - fs.readdir 函数中的竞争条件在哪里?

转载 作者:太空宇宙 更新时间:2023-11-04 00:30:11 25 4
gpt4 key购买 nike

我想列出目录中的所有文件夹,并在最后列出有多少个文件夹。

这是我的代码:

fs.readdir(dir, (err, folders) => {
if (err) return console.log(err);

let count = 0;
for (let i = 0; i < folders.length; i++) {
let folder = folders[i];

fs.stat(dir + '/' + folder, (err, stats) => {
if (err) return console.log(err);

if (stats.isDirectory()) {
console.log(folder);
count++;
}
if (i >= (folders.length - 1)) {
console.log('folders: ' + count);
}
});
}
});

代码应该:

  1. 阅读目录
  2. 增加目录中每个文件夹的计数
  3. 目录读取完成后,记录'folders: ' + count

在大多数情况下,这确实有效,我得到了这个:

...
2016-12-20--09-59-12
2016-12-20--09-59-13
2016-12-20--09-59-14
folders: 86

有时我会得到这个:

...
2016-12-20--09-59-12
2016-12-20--09-59-11
2016-12-20--09-59-14
folders: 85
2016-12-20--09-59-13

竞争条件发生在哪里?

最佳答案

我意识到竞争条件的发生是因为 i 可以在所有 fs.stat 完成执行之前完成递增,因为它在 fs 之外递增。 stats 的回调。

因此,我需要一个单独的变量 (j) 来跟踪所有 fs.stats 的完成情况,并且仅当那些完成时完成递增后我可以列出count吗?

正确的代码如下:

fs.readdir(dir, (err, folders) => {
if (err) return console.log(err);

let count = 0,
j = 0; // this bad boy!

for (let i = 0; i < folders.length; i++) {
let folder = folders[i];

fs.stat(dir + '/' + folder, (err, stats) => {
if (err) return console.log(err);
j++; // j, unlike i, only gets incremented *inside* the async function

if (stats.isDirectory()) {
console.log(folder);
count++;
}
if (j >= folders.length) { // check j, not i
console.log('folders: ' + count);
}
});
}
});

现在输出是一致的:

...
2016-12-20--09-59-13
2016-12-20--09-59-11
2016-12-20--09-59-14
folders: 86

关于node.js - fs.readdir 函数中的竞争条件在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41241093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com