JavaScript及MongoDB中如何查询回调函数可用参数及相关问题咨询
问题1:如何知晓回调函数的可用参数?
回调函数的参数列表完全由调用该回调的上层函数的设计决定,没有统一的固定规则,你使用对应方法时查询该方法的官方API文档即可:
- 示例中#1
MongoClient.connect的回调第二个参数是MongoDB连接实例,是3.x版本驱动的API设计 - #2
toArray是游标查询的方法,回调第二个参数是查询得到的文档数组 - #3
insertMany是批量插入方法,回调第二个参数是插入操作的结果对象,包含插入条数、成功插入的文档等信息 - #4 是4.x版本驱动的
client.connectAPI,设计上取消了第二个参数,连接成功后直接使用外部声明的client实例即可,所以回调没有第二个参数。
如果暂时看不懂文档,也可以临时用剩余参数打印所有传入的回调参数来确认:
// 示例:打印connect回调的所有参数 client.connect(function(...args) { console.log(args) // 就能看到所有传入的参数内容 })
问题2:err参数的相关规则
Node.js生态有统一的错误优先回调约定,所有异步操作的回调,err参数都会放在第一位:
- 这个是社区约定,不是JS语法强制,但是几乎所有Node.js官方API、第三方库都会遵守该规范
- 你可以选择不声明
err参数,如果你不需要处理错误(不推荐生产环境这么做),只是拿不到错误信息而已,代码不会报错 - 你自己封装的函数可以自定义参数顺序,但如果是公用代码、或者希望符合Node.js开发规范,就不要把
err放在非第一位,会大幅降低代码的可维护性。
问题3:如何判断一个函数是否支持传入回调?
最直接的方式是查询该函数的官方文档,文档的参数说明会标注是否支持传入回调作为最后一个参数。
如果没有文档,也可以通过两种方式判断:
- 阅读该函数的源码实现,看是否会调用最后一个传入的函数类型参数
- 简单测试:传入一个打印日志的函数作为最后一个参数,运行后看该函数是否会被触发。
目前Node.js生态的异步方法大多同时支持回调和Promise两种调用方式,很多新的教程也会更推荐用async/await的Promise写法,可读性比回调更高。
问题4:为什么99.1传了result但99.2的回调没有接收?
insertDocuments 是通用封装函数,作者在封装的时候,会考虑到不同调用方的需求:部分场景下调用方可能需要用到插入操作的result结果做后续处理,所以会主动把result传给回调,给调用方留足选择空间。
当前场景下你不需要用到result,所以可以不声明参数接收,不影响代码运行。如果封装的时候直接写callback(),后续有需要用到result的场景就没法拿到数据,等于把函数的扩展性做死了。
内容的提问来源于stack exchange,提问作者user587266
相关产品推荐
相关产品推荐

