Nodejs一些函数中的回调原理疑问

最近在学nodejs,看到很多函数后面都会有一个回调函数。例如我举一个不恰当的例子并说明我的疑惑

例如有这样一个代码,我进行改写:

  readFile('abc',(err,files) => {
    if(err) throw err
    else {
      console.log(files) // 如果readFile的第一个参数不为false,就输出第一个参数的值
    }
  })

例如这个函数是这样暴露api实现上面注释功能的,那么我很好奇源码会如何定义的。自己也尝试写了一下

   function readFile(path,callback) {
     let flag = false
     if(path) {
       flag = true // 我的思路是设置一个标志位,当flag为true则回调函数的err就为false
     }
     .... // 后面就有点模糊不知道怎么写了
   }

求大神帮忙解惑一下,也可能是我JS掌握的不太扎实。。有点乱了,谢谢啦

阅读 2.4k
3 个回答

如果只是满足你第一个注释的要求的话,按下面这样写就好了

function readFile(path, callback) {
  if (path !== false) {
    callback(null, path)
  } else {
    callback(new Error('path is false'))
  }
}

node 里面回调的第一个参数是 err ,如果没有错误的话 err=null,这样在回调函数里面可以通过 if(err){ throw err} 来判断是否有错误,如果没有错误,就不会执行判断里面的语句,如果有错误根据需要抛出错误或者做别的处理.

如果你问源码实现,那不是这个样子,如果你问的是编码模式,那可能是下面那样子:

   function readFile(path,callback) {
     let flag = false
     if(path) {
       flag = true // 我的思路是设置一个标志位,当flag为true则回调函数的err就为false
     }
     // ...读取文件 files 是读取文件的结果
     callback(flag, files)
   }
  • 源码:

clipboard.png

写不下去就对了 实际上node里面的readfile是c++实现的 调用libuv的uv_fs_read 这个函数可以设置回调 再底层就是libuv里面开了线程阻塞在那里等文件读取

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题