簡體   English   中英

循環內的NodeJS fs.stat

[英]NodeJS fs.stat inside a loop

我有一個奇怪的問題。我想它與節點異步工作方式有關,但我不知道該如何解決。

我有以下代碼:

function traverse(dir) {

console.log("START: " + dir);

fs.readdir(dir, function(err, list) {

    list.forEach(function(element) {
        path = dir + "/" + element

        console.log("Loop files/folders : " + path);

        fs.stat(path, function(err, stats,) {

            console.log("fs.stats file path : " + path + " : " + stats.isDirectory())
        });
    }, this);
});

}

這給出以下輸出:

START: ./data/2017
Loop files/folders : ./data/2017/.DS_Store
Loop files/folders : ./data/2017/1
Loop files/folders : ./data/2017/2
Loop files/folders : ./data/2017/3
Loop files/folders : ./data/2017/Arendal2017.pptx
fs.stats file path : ./data/2017/Arendal2017.pptx : false
fs.stats file path : ./data/2017/Arendal2017.pptx : true
fs.stats file path : ./data/2017/Arendal2017.pptx : true
fs.stats file path : ./data/2017/Arendal2017.pptx : true
fs.stats file path : ./data/2017/Arendal2017.pptx : false

從代碼中可以看到,首先我在循環中給出了路徑字符串的輸出。 然后,在同一循環內,我對控制器內部的每個路徑(元素)進行統計。 這里發生的是,當我在fs.stat回調中使用路徑變量時,它引用的是最后一個文件“ Arendal”,而不是循環中的每個項目。 根據文件和目錄的列表,isDirectory bool實際上是正確的,但是對於我來說,使用給定的isDirectory bool獲取正確的路徑也很重要。

如何解決呢?

這里的問題是您沒有在正確的范圍內聲明path變量。

將您的代碼更改為

list.forEach(function(element) {
    var path = dir + "/" + element; // <=== DECLARE IT HERE

    console.log("Loop files/folders : " + path);

    fs.stat(path, function(err, stats,) {

        console.log("fs.stats file path : " + path + " : " + stats.isDirectory())
    });
}, this);

對於這種清單,假設它只是一個命令行實用程序,則可以通過簡單地使用fs的同步功能來獲得更清晰的日志(以便將調用順序保留在日志中)。

@DenysSéguret回答了您的問題

只需添加兩件事:

1 /將異步代碼放入循環中是一種不好的做法

2 /因為您使用節點,所以我想它支持ES6(取決於您使用的版本)。 試試看!

try {
  const stats = await Promise.all(list.map((element) => {
    const path = `${dir}/${element}`;

    console.log(`Loop files/folders : ${path}`);

    return fs.stat(path);
  }));

  stats.forEach(x => console.log(`fs.stats file path : ${path} : ${stats.isDirectory()}`));
} catch (err) {
 // Error handling
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM