node.js - 为 DRY 重构节点代码(不要重复你自己)
问题描述
有下面的代码
exports.list_tum_izinler = function (req, res) {
var _user = toknHelper.getUserFromToken(req);
izinler.list_Izinler(_user.username, sendResult);
function sendResult(data) {
if (data instanceof Error) {
res.status(500).send(data.message);
return;
}
res.status(200).send(data);
}
}
exports.Izin_Counts= function (req, res) {
var _user = toknHelper.getUserFromToken(req);
izinler.Count_Izinler(_user.username, sendResult);
function sendResult(data) {
if (data instanceof Error) {
res.status(500).send(data.message);
return;
}
res.status(200).send(data);
}
这里试图将代码重构为 DRY,我想提取这一部分
function sendResult(data) {
if (data instanceof Error) {
res.status(500).send(data.message);
return;
}
res.status(200).send(data);
}
作为外部函数并将数据和 res 参数发送到该函数。这里的重点是从函数返回的 data 参数和 res 参数是一个外部参数,所以我如何发送带有 data 参数的 res 参数。
解决方案
创建一些其他文件... myFunction.js:
const sendResult = ({ res, data }) => {
if (data instanceof Error) {
res.status(500).send(data.message);
return;
}
res.status(200).send(data);
};
module.exports = sendResult;
然后,将其添加到您当前的代码中:
const sendResult = require('./myFunction');
exports.list_tum_izinler = function (req, res) {
var _user = toknHelper.getUserFromToken(req);
izinler.list_Izinler(_user.username, sendResult);
}
您需要意识到您正在将此函数用作回调,因此如果您想将此函数提供给izinler.Count_Izinler(_user.username, sendResult)
,那么您需要修改该函数以正确为其提供响应..因此您还需要传递响应进入该函数并在需要时将其提供给回调:
const Count_Izinler(username, res, callback) => {
// dunno what this function does... but maybe it gets data somewhere
let data = 'some data';
callback({res, data});
}
但是,如果您要这样做,您最好将该函数要求到实现本身中,而不是在高阶函数中并将其作为回调删除:
const sendResult = require('./path/to/myFunction');
const Count_Izinler(username, res) => {
// dunno what this function does... but maybe it gets data somewhere
let data = 'some data';
return sendResult({res, data});
}
const list_izinler(username, res) => {
// dunno what this function does... but maybe it gets data somewhere
let data = 'some data';
return sendResult({res, data});
}
然后,您将像这样调用这些函数:
izinler.list_Izinler(_user.username, res);
但是,老实说,这主要是产生了一堆乱七八糟的代码,让人们感到困惑。它变得更难维护了。你未来的自己会恨你这样做。我建议您只返回data
from Count_Izinler
and list_Izinler
,然后将其输入到您的sendResult
... 中,如下所示:
const sendResult = require('./myFunction');
exports.list_tum_izinler = function (req, res) {
var _user = toknHelper.getUserFromToken(req);
const data = izinler.list_Izinler(_user.username); // <-- modify this function to only take user name, and RETURN whatever it does, which is the "data"
return sendResult({res, data});
}
exports.Izin_Counts= function (req, res) {
var _user = toknHelper.getUserFromToken(req);
const data = izinler.Count_Izinler(_user.username); // <-- modify this function to only take user name, and RETURN whatever it does, which is the "data"
return sendResult({res, data});
}
不幸的是,您忽略了其他代码片段,例如list_Izinler
,Count_Izinler
让某人完全给您一个 100% 准确的答案。如果您想要更清晰的答案,请提供更多其他功能的代码片段。
编辑:使用异步/等待..
exports.list_tum_izinler = async function (req, res) { // <-- specify the function as async...
var _user = toknHelper.getUserFromToken(req);
const data = await izinler.list_Izinler(_user.username); // <-- use "await" before the invocation. This function must return a promise in order for this to work. If it does not, list_Izinler needs to be modified to return a promise... mostly a trivial thing to do...
return sendResult({res, data});
}
推荐阅读
- swift - 项目安装到真机失败
- flutter - 滚动时 SilverApp 隐藏不起作用
- c# - 用于 sql 查询的组 formcollection 键
- data-analysis - 当日期范围比另一个长时,比较 YoY 数据的最佳方法是什么?
- .net - DataGridViewCell - 在不失去焦点的情况下更改背景颜色
- php - 递归的 Foreach
- javascript - 将每个子函数的上下文绑定到父函数
- java - 如何将唯一标识符添加到先前活动的另一个唯一标识符中?
- python - globals() 不适用于 concurrent.futures 模块?
- c# - 在 ViewModel c# ASP.Net 5 中使用接口