node.js - 脚本中和在解释器中使用 fs.readFile() 得到不同的结果
迷茫
迷茫 2017-04-17 11:11:38
[Node.js讨论组]

因为完全没理解 回调函数 的概念,所以我写了以下的代码

(function() {

    var fs = require('fs');

    var callback = (function() {

        str = '';

        return function(err, contents) {

            if (contents !== undefined) {
                str += contents;
            }
            return str;

        };

    })();

    fs.readFile(process.argv[2], 'utf8', callback);
    var lines = callback().split('\n').length - 1;

    console.log(lines);
})();

不知为何,在解释器里直接运行则没问题,可是保存为脚本运行时,lines 就只能为 0 了,这是为什么呢?谢谢!

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(2)
迷茫

试下:

(function() {
    var fs = require('fs');
    var callback = function(err, contents) {
        var str='';
        if (contents !== undefined) {
            str += contents;
        }
        var lines = str.split('\n').length - 1;
        console.log(lines);
    };
    fs.readFile(process.argv[1], 'utf8', callback);
})();

因为当保存为文件的时候,这里就用到了fs.readFile ,而nodejs是异步非阻塞的.

它会先执行后面的代码,当文件读取完之后再执行callback中的方法,所以fs.readFile还没有执行完,就执行了后面来计算行数,当然为0了。

你可以在callback 中console.log('hello'),看看执行顺序就知道了!
tips:你用callback()想要来获取str也不对吧,连参数都没有哦~

因此由于nodejs的异步非阻塞,当你需要获取fs.readFile等类似的函数执行的结果的时候,就需要将处理结果的代码卸载callback中,否则代码的执行结果往往会令人匪夷所思。

当有大量的这样的需求的时候就会出现callback的循环嵌套了,最后的代码就会很难维护,所以就需要借助一个模块来进行流程控制了,我用的是async

注:当然nodejs也提供了readFileSync类似的同步函数,但是非常不建议这么做,否则nodejs的优势就没了!

迷茫

对node并不是特别的了解, 但是callbackreadFile结束之后去调用的, 所以在callback方法里面拿到的才是正确的数据

打个比方, 就好像

你跟小明说: 你帮我数下这个文件有多少行,然后写黑板上,我告诉老湿
然后你马上去读黑板上的数字(这个时候小明还没有数完)告诉老湿(实际上可以看成和小明数文件是个并行的过程), 这时候结果是不对的
正确是:小明你帮我数一下,数完之后,直接告诉老湿

上面的红字部分, 就是回调函数

体现在代码上, 大概是这样

(function() {
  var fs = require('fs'),
    callback = function(err, contents) {
      if (!err && contents !== undefined) {
        var lines = contents.split('\n').length - 1;
        console.log(lines);
      }
      else{console.log("Failed");}
    };

  fs.readFile(process.argv[2], 'utf8', callback);
})();
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号