【发布时间】:2016-09-07 11:07:53
【问题描述】:
我试图在这里搜索类似的问题,但令人惊讶的是找不到已经发布的问题。
我使用 expressjs v4 框架,我正在构建这样的路线:
'use strict';
let express = require('express');
let router = express.Router();
let users = require('./modules/users');
router.post('/',users.add);
router.put('/edit/:id',users.edit);
正如你在上面看到的,我需要let users = require('./modules/users')
现在users 模块看起来(假设)如下:
'use strict';
let usersDbModule = require('...');
let users = {
'add': (req, res, next) => {
let callback = (err, record) => {
//...do something
users.function1(record)
}
usersDbModule.save(req, callback);
},
'function1': (record) => {
users.function2()
},
'function2': () => {
//...do something with next() function
}
}
您可以注意到,第一个代码块中的路由器正在使用模块的add 函数。 add 函数,它是一个标准的 express 中间件函数,但现在事情变得越来越复杂了。
如您所见,add 函数将next 作为参数之一,现在我正在执行来自不同函数的一些复杂回调调用,假设最后我想在@ 中调用next 987654330@.
我的问题是,在同一模块内的不同回调函数之间传递 req、res 和 next 参数的最佳方式是什么。
我想出了 3 种不同的方法:
方法一:
如有必要,将req、res 或next 传递给链中的所有函数,因此在这种情况下,我必须将next 传递给callback,而不是传递给function1,而不是从function1 传递给function2.
在我看来,这不是最好的方法,难以维护、阅读和测试。
方法二:
将 function1 和 function2 包裹在 add 中的闭包中,传递所有必要的参数。在这种特殊情况下,我只需要包装 function2 并通过 next 闭包,所以它看起来像这样:
'add': (req, res, next) => {
users.function2(next);
//....rest of the code of the function add
}
比function2 本身:
'function2': (next) => {4
return () => {
//...now I have access to next here
// without a need to pass it to each and every
// function in the chain
}
}
方法三:
将所有必要的函数/变量附加到res.locals 并仅传递res 对象。
它与Method 1 有完全相同的问题,所以我个人赞成Method 2,但不确定它是否不会降低代码的可读性,也许还有其他一些问题,没有与团队一起在生产或开发环境中对其进行了测试。
我真的很想听听你们在使用什么以及它在您的项目/团队中的作用。任何偏好、最佳实践、最佳模式?请分享,我真的很想知道什么是最好的方法。
也许有更好的方法?
非常感谢所有反馈!
现实生活中的例子:
function1 和 function2 以及可能更多的示例用法...
假设我们有一个从外部 API 获取数据的适配器,它需要将数据保存到数据库中并返回响应。我们还假设从 API 返回的数据在 5s 后过期。如果客户端在 5 秒内到达路由,它会从数据库中获取数据,如果调用之间的时间较长,则它会重复调用 API 的操作。
这当然比function1 和function2 更复杂。它需要来自适配器和数据库的大量回调函数,还需要从数据库中获取数据,适配器,将数据保存到数据库中以及最终从数据库中删除数据的单独函数,它至少提供4个回调函数已经。
【问题讨论】:
标签: javascript node.js express callback