Mozilla Node/Express教程中async.parallel无return函数如何返回值?
核心原因:async.parallel 依赖回调函数传递结果,完全不读取任务函数的return值
这是Node.js早期回调式异步编程的典型设计模式,具体逻辑可以拆解为以下几点:
- 你传入
async.parallel的每个属性(比如book_count、author_count)对应的函数,都会自动接收到async库注入的一个回调函数作为入参,这个回调就是async库用来接收异步任务结果的“通信入口”。 - 你代码中用到的Mongoose查询方法
countDocuments本身就是异步接口,它的第二个参数就是标准的「错误优先回调」:- 查询成功时,回调第一个参数
err为null,第二个参数为查询到的数量 - 查询失败时,回调第一个参数为错误对象
- 查询成功时,回调第一个参数
- 你的代码里直接把async注入的
callback传给了countDocuments作为第二个参数,相当于告诉Mongoose:“你查完结果直接调用这个async给我的回调就行,结果会自动传给async库”。 - async库会监听所有任务的回调调用:
- 只要有一个任务回调传入了非空的错误值,async会立刻终止所有任务,调用你传给
parallel的第二个最终回调,把错误透传进去 - 所有任务都成功完成回调后,async会把所有回调返回的结果,按照你定义的key拼成完整的
results对象,传给最终的回调函数,也就是你代码里用来渲染页面的results变量。
- 只要有一个任务回调传入了非空的错误值,async会立刻终止所有任务,调用你传给
你可以用下面这段最小Demo验证逻辑,不需要return也能正常拿到结果:
const async = require('async') async.parallel({ test1: function(callback) { // 模拟异步操作,1秒后返回结果 setTimeout(() => callback(null, "第一个任务结果"), 1000) }, test2: function(callback) { setTimeout(() => callback(null, "第二个任务结果"), 500) } }, function(err, results) { // 输出 {test1: "第一个任务结果", test2: "第二个任务结果"} console.log(results) })
内容的提问来源于stack exchange,提问作者Jorge Barbi
相关产品推荐
相关产品推荐

