使用fs.readFile的简单nodejs回调示例

 执笔W写下我们的故事 发布于 2023-02-09 17:57

我正在尝试学习异步编程,并且正在努力学习nodeschool.io的第4课,并实现了带回调的异步io.

基本上,我正在尝试使用fs.readFile来计算使用回调的文件中的换行符数.

这是我的代码:

var fs = require('fs');
var pathToFile = process.argv[2];

function counter(callback) {
    var buffer = fs.readFile(pathToFile, function (err, data) {
    var bufferString = buffer.toString();
    var bufferStringSplit = bufferString.split('\n');
  });
  callback();
}

function logMyNumber() {
  console.log(bufferStringSplit.length-1);
}

counter(logMyNumber);

我知道一旦代码行完成执行就会执行回调,所以不应该执行

var bufferString = buffer.toString();
var bufferStringSplit = bufferString.split('\n');

在fs.readFile()完成从磁盘读取文件后调用?

最后,callback()调用logMyNumber,它应该只输出文件所具有的行数.

1 个回答
  • 您有几个问题正在进行中,我将尝试尽可能地概述它们

    问题1:可变范围

    var fs = require('fs');
    var pathToFile = process.argv[2];
    
    function counter(callback) {
      var buffer = fs.readFile(pathToFile, function (err, data) { 
        // Both of the following variables are scoped to the callback of fs.readFile
        var bufferString = buffer.toString(); 
        var bufferStringSplit = bufferString.split('\n'); 
      });
      callback();
    }
    
    function logMyNumber() {
      // Because the variables are in a closure above, bufferStringSplit is null here
      console.log(bufferStringSplit.length-1);
    }
    
    counter(logMyNumber);
    

    解:

    声明模块范围内的变量:

    var fs = require('fs');
    var pathToFile = process.argv[2];
    
    // These can now be accessed from anywhere within the module
    var bufferString, bufferStringSplit;
    
    function counter(callback) {
      fs.readFile(pathToFile, function (err, data) {
        bufferString = data.toString(); 
        bufferStringSplit = bufferString.split('\n'); 
        callback();
      });
    }
    
    // bufferStringSplit should no longer return null here
    function logMyNumber() {
      console.log(bufferStringSplit.length-1);
    }
    

    问题2:回调

    function counter(callback) {
      fs.readFile(pathToFile, function (err, data) {
        bufferString = buffer.toString(); 
        bufferStringSplit = bufferString.split('\n'); 
    
        // Place the callback WITHIN the other callback, otherwise they run in parallel
        callback();
      });
    }
    

    问题3:fs.readFile API

    fs.readFile不会返回任何内容,因此buffer下面的变量是null

    function counter(callback) {      
      var buffer = fs.readFile(pathToFile, function (err, data) {
        bufferString = buffer.toString(); 
        bufferStringSplit = bufferString.split('\n'); 
      });
      callback();
    }
    

    解:

    function counter(callback) {      
      fs.readFile(pathToFile, function (err, data) {
        // The data argument of the fs.readFile callback is the data buffer
        bufferString = data.toString(); 
        bufferStringSplit = bufferString.split('\n'); 
      });
      callback();
    }
    

    最后,代码应如下所示:

    var fs = require('fs');
    var pathToFile = process.argv[2];
    
    var bufferString, bufferStringSplit;
    
    function counter(callback) {
      fs.readFile(pathToFile, function (err, data) {
        bufferString = data.toString(); 
        bufferStringSplit = bufferString.split('\n'); 
        callback();
      });
    }
    
    function logMyNumber() {
      console.log(bufferStringSplit.length-1);
    }
    
    counter(logMyNumber);
    

    2023-02-09 18:00 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有