鍍金池/ 問答/HTML/ node實(shí)現(xiàn)文件列表加載,代碼執(zhí)行順序怪異

node實(shí)現(xiàn)文件列表加載,代碼執(zhí)行順序怪異

let fs =  require ('fs');
let stdin = process.stdin,
    stdout = process.stdout;
fs.readdir(process.cwd(),function (err,files) {
    console.log(files);
    console.log('');
    if (!files.length){
        return console.log('NO FILES\n');
    }else

    function file(i) {
        var filename = files[i];
        fs.stat(__dirname + '/' + filename, function (err, stat) {
            if (stat.isDirectory()) {
                console.log(i +':Dir:' + filename + '\n');
            }
            else {
                console.log(i +':File:' + filename + '\n');
            }
        });

        i++;
        console.log("?。?!"+i + files.length);
        if (i === files.length){  
          read(); //列表掃描完后才進(jìn)入
        }else {
            file(i); //遞歸加載
        }
    }
    file(0);//初始加載
})
function read() {
    
    stdout.write('ENTER THE CHOOSE\n');
    stdin.resume();
}

按照了不起的nodejs 書中的代碼敲的。。。。
功能:列出當(dāng)前目錄的文件,在最后輸出“enter the choose”

debug如下

?。。?5 //第一個(gè)是i,第二個(gè)是length
?。?!25
?。?!35
!?。?5
?。?!55
ENTER THE CHOOSE
1:Dir:.idea
2:File:index.js
3:File:package.json
4:Dir:test
5:File:test.txt

enter the choose 本應(yīng)該在最后輸出的才對(duì)。。
ps且如果沒有封裝read函數(shù) 輸出的列表順序是無序的..

回答
編輯回答
深記你
fs.stat

是異步函數(shù),不確定什么時(shí)候能執(zhí)行完,而且只有等到同步函數(shù)執(zhí)行完之后,它才開始
換成fs.statSync可以達(dá)到你要的效果

2018年7月21日 01:12