javascript - Node.js中输出顺序为什么和预期的不一样呢?

查看:121
本文介绍了javascript - Node.js中输出顺序为什么和预期的不一样呢?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

考察下面的代码,它用于用于输出指定目录下的文件

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);        //开始执行
    }
});

上述代码输出的结果我不能理解,按照这个程序设计的逻辑,应该先是把目录下所有文件都列出来,然后计数器i==files.length后才输出输出完毕这个终结语。


如上图所示,不但输出完毕这个终结语最先输出,而且打印顺序完全是错乱的,多次运行的打印顺序也不稳定。

我在想是不是异步调用有时间差,所以将上述代码sleep(1000)注释部分去掉,但是结果依然与我所预期不一致:文件如下提示语先输出,此后停止1s后,后续语句几乎同时出,没有停顿,并且输出完毕这个终结语依然第一个被打印

综上所述,我想知道的是

  1. 为什么打印结果不稳定,为什么输出完毕这个提示语首先被输出?

  2. 为什么加上sleep(1000)这个暂停语句后,只有一开始停了1s,后面不再暂停而是同时输出?

  3. 如何解决这个问题,即如何在修改尽可能少的情况下让输出完毕这个提示语最后输出?

谢谢各位大佬赐教!

解决方案

  1. fs.stat是异步操作,所以你的输出文件信息都是异步执行的,输出完毕肯定先打印的。想同步可以用这个https://nodejs.org/docs/lates...

  2. 在sleep里加个console.log('sleep')看是不是 只输出一次?

  3. 如果你想保证输出文件信息之后才输出输出完毕,第一点里我提到的用fs.statSync估计修改比较少吧

这篇关于javascript - Node.js中输出顺序为什么和预期的不一样呢?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆