关于回调的过程的一个问题。。
发布于 12 年前 作者 cooldrine 4238 次浏览 最后一次编辑是 8 年前

var fs = require (‘fs’);

fs.readFile (‘D:\a.txt’,‘utf8’, function (err,data) { if (err) throw err; console.log(data); })

这个过程应该是怎么样的啊? 我理解的是, 第一个地址传给readFile得到一个返回值a1,utf8再传给readFile,得到一个返回值a2,然后function作为回调函数传给readFile,function开始传递参数,返回值a1传给err,返回值a2传给data。如果地址出错,err里就是保存的错误信息,如果地址正确,err就是保存的a.txt里的内容。

我知道我的理解是错的。。但到底哪里有问题啊,按我的理解的话就算是把console.log(data);这句去掉,throw err还是可以正确打印出内容。。但事实上缺不是。。。求开导 = =

6 回复

首先代码标记下…

  • 第一步: 文件名, utf8, 回调函数, 三者一起传给 fs.readFile
  • 第二步: readFile 存下回调函数(这个过程我也不清晰)… 然后调用 C++ 代码, 读取文件
  • 第三步: 文件读取完成, 调用存下来的回调函数, 传递两个参数进去 errdata

err 是如果有错误产生, 就会用 err 这个对象, 没有错误, err 就是 null data 只有在正常没有出错时才有, 内容是文件字符串…

throwconsole.log 是完全不一样的…

我是这样理解的:fs可以调用运行时的参数,自己的属性和全局变量,job done后把job传回callback,callback爱怎么处理就咋处理

fs={
    someatt:something,
    someatt:anotherthing,
    readFile:function(filename,format,callback){
        var something,err,getfile....etc
       
         //do the job with global var or argument or fs.att
        
        callback(err,getfile)
    }
}

但问题就在这。。怎么保证err参数就一定接受的是出错时的错误信息呢?

@CooldrinE 底层调用代码是libuv实现的,它来保证。

@CooldrinE 好像也只能这么讲, 如果这都做不好, API 都没法保证了不是么

@jiyinyiyong 噢 明白了。。

回到顶部