Periksa kod berikut, yang digunakan untuk mengeluarkan fail dalam direktori yang ditentukan
var fs=require('fs');
function sleep(numberMillis) { //sleep方法,暂停numberMillis毫秒
var now = new Date();
var exitTime = now.getTime() + numberMillis;
while (true) {
now = new Date();
if (now.getTime() > exitTime)
return;
}
}
fs.readdir(__dirname,function(err,files){ //文件读取方法
console.log('');
if(!files.length){
console.log('找不到文件 \n');
}else{
console.log('文件如下:');
function file(i){
var filename=files[i];
fs.stat(__dirname+'/'+filename,function(err,stat){
if(stat.isDirectory()){
console.log(' '+i+'文件夹:'+filename+'/...');
}else{
console.log(' '+i+'文件:'+filename+'');
}
});
i++;
//sleep(1000); //。。。。。。。。######暂停1s
if(i==files.length){
console.log('输出完毕');
}else{
file(i); //否则递归调用
}
}
file(0); //开始执行
}
});
Saya tidak dapat memahami hasil keluaran kod di atas Mengikut logik reka bentuk program ini, semua fail dalam direktori harus disenaraikan dahulu, dan kemudian pembilang i==files.length
harus digunakan untuk mengeluarkan ayat terminal "Output selesai. ".
Seperti yang ditunjukkan dalam gambar di atas, bukan sahaja perkataan akhir "Output selesai" dikeluarkan dahulu, tetapi susunan pencetakan benar-benar berantakan, dan susunan pencetakan berbilang larian juga tidak stabil.
Saya tertanya-tanya sama ada terdapat perbezaan masa dalam panggilan tak segerak, jadi saya mengalih keluar bahagian ulasan sleep(1000) kod di atas, tetapi hasilnya masih tidak konsisten dengan apa yang saya jangkakan: Gesaan "Fail seperti berikut" telah dikeluarkan pertama, dan kemudian berhenti selama 1 saat, dan kenyataan seterusnya hampir Pada masa yang sama, tiada jeda, dan perkataan akhir "output selesai" masih yang pertama dicetak.
Ringkasnya, apa yang saya ingin tahu ialah
Mengapa hasil cetakan tidak stabil Mengapakah output "output selesai" terlebih dahulu?
Mengapa selepas menambah pernyataan jeda sleep(1000)
, ia hanya menjeda selama 1 saat pada permulaan, dan kemudian ia tidak lagi menjeda tetapi mengeluarkan secara serentak?
Bagaimana untuk menyelesaikan masalah ini, iaitu, bagaimana untuk membuat gesaan "Output Complete" akhirnya dikeluarkan dengan sedikit pengubahsuaian yang mungkin?
Terima kasih atas nasihat anda!
fs.stat
ialah operasi tak segerak, jadi maklumat fail output anda dilaksanakan secara tak segerak dan "output selesai" mesti dicetak terlebih dahulu. Jika anda ingin menyegerakkan, anda boleh menggunakan ini https://nodejs.org/docs/lates...Tambah console.log('sleep') untuk tidur untuk melihat sama ada ia hanya keluar sekali?
Jika anda ingin memastikan bahawa "output selesai" dikeluarkan hanya selepas mengeluarkan maklumat fail, penggunaan fs.statSync yang saya nyatakan dalam perkara pertama mungkin memerlukan kurang pengubahsuaian
Menurut jawapan @Dont, ia sememangnya sebab untuk panggilan kaedah tak segerak, kerana fungsi panggil balik fs.stat dipanggil dalam pengundian acara Ia biasanya dipanggil semasa jurang antara berjalannya program utama, dan masa dan susunan dipanggil tidak pasti. Penyegerakan boleh dicapai menggunakan kaedah statSync: