javascript - Mengapakah susunan output dalam Node.js berbeza daripada yang dijangkakan?
大家讲道理
大家讲道理 2017-05-31 10:40:11
0
2
628

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

  1. Mengapa hasil cetakan tidak stabil Mengapakah output "output selesai" terlebih dahulu?

  2. 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?

  3. Bagaimana untuk menyelesaikan masalah ini, iaitu, bagaimana untuk membuat gesaan "Output Complete" akhirnya dikeluarkan dengan sedikit pengubahsuaian yang mungkin?

Terima kasih atas nasihat anda!

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

membalas semua(2)
大家讲道理
  1. 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...

  2. Tambah console.log('sleep') untuk tidur untuk melihat sama ada ia hanya keluar sekali?

  3. 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

Ty80

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:

(function file(i){
    var filename=files[i];
    function read(stat){
        if(stat.isDirectory()){
            console.log(' '+i+' 3[36m 文件夹:'+filename+'/...3[39m');
        }else{
            console.log(' '+i+' 3[36m 文件:'+filename+'3[39m');
        }
    };
    read(fs.statSync(__dirname+'/'+filename));
    i++;
    ................
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan