Как сократить множество однотипных функций js?
Есть очень много подобных функций:
function MYSQL_INSERT_LoginSteamSession(parametr, ip)
{
return console.log(parametr, ip)
}
function mysqlPayAddBill(steamId, c, payment, amount, time, status)
{
return console.log(steamId, c, payment, amount, time, status)
}
function mysqlPayGetBills(mysql, steam) {
return console.log(mysql, steam)
}
function mysqlPayGetBillsNow(steam) {
return console.log(steam)
}
function mysqlPaySetBillsStatus(int) {
return console.log(int)
}
У функций не меняется ничего кроме принимаемых параметров в запрос.
Как сократить написание всех этих функций, и объединить их в какой ни будь одной? /
function MYSQL_INSERT_LoginSteamSession(ip, steam, refreshToken, token, role) {
return new Promise((resolve, reject) => {
connection.query(`INSERT crm_auth(ip, steam, refreshToken, token, role) \
VALUES ('${ip}', '${steam}', '${refreshToken}', '${token}', '${role}')`,
function(err, results, fields)
{
if(err) return err;
else resolve(results)
}
)
})
}
function mysqlPayAddBill(steamId, billId, payment, amount, time, status) {
return new Promise((resolve, reject) => {
connection.query(`INSERT crm_pay_billing(steam, billId, payment, amount, time, status) \
VALUES ('${steamId}', '${billId}', '${payment}', '${amount}', '${time}', '${status}')`,
function(err, results, fields)
{
if(err) return err;
else resolve(results)
}
)
})
}
function mysqlPayGetBills() {
return new Promise((resolve, reject) => {
connection.query(`SELECT billId FROM crm_pay_billing WHERE time<${Date.now()-3600000} && status='ADDED'`,
function(err, results, fields)
{
if(err) return err;
else resolve(results)
}
)
})
}
function mysqlPayGetBillsNow() {
return new Promise((resolve, reject) => {
connection.query(`SELECT billId FROM crm_pay_billing WHERE time>${Date.now()-3600000} && status='ADDED'`,
function(err, results, fields)
{
if(err) return err;
else resolve(results)
}
)
})
}
function mysqlPaySetBillsStatus(billId) {
return new Promise((resolve, reject) => {
connection.query(`UPDATE crm_pay_billing SET status='PAID' WHERE billId='${billId}'`,
function(err, results, fields)
{
if(err) resolve(err);
else resolve(results)
}
)
})
}
Ответы (1 шт):
Автор решения: Sergey Tatarincev
→ Ссылка
Поскольку внутренности отличаются только выполняемым запросом, можно по количеству параметров "угадать" что надо выполнить
function myMultiFunc(){
var args = Array.prototype.slice.call(arguments);
var argc = arguments.length;
console.log('we got '+argc+' arguments: ');
args.forEach(a => console.log(a));
// По количеству аргументов не сможем распознать идентичные по количеству аргументов mysqlPayGetBills() и mysqlPayGetBillsNow()
var querystring="";
switch(argc){ // в зависимости от количества аргументов
case 1: //mysqlPaySetBillsStatus(billId) - 1 параметр
querystring = `UPDATE crm_pay_billing SET status='PAID' WHERE billId='${args[0]}'`; break;
case 5: // MYSQL_INSERT_LoginSteamSession(ip, steam, refreshToken, token, role) - 5 параметров
querystring = `INSERT crm_auth(ip, steam, refreshToken, token, role) VALUES ('${args[0]}', '${args[1]}', '${args[2]}', '${args[3]}', '${args[4]}')`; break;
case 6: // mysqlPayAddBill(steamId, billId, payment, amount, time, status) - 6 параметров
querystring = `INSERT crm_pay_billing(steam, billId, payment, amount, time, status) VALUES ('${args[0]}', '${args[1]}', '${args[2]}', '${args[3]}', '${args[4]}', '${args[5]}')`; break;
default: // Если по количеству аргументов непонятно что вызвали
console.log('Unknown arguments count :(');return;
};
console.log('we want to execute statement: '+querystring);
/*
return new Promise((resolve, reject) => {
connection.query(querystring,
function(err, results, fields)
{
if(err) return err;
else resolve(results)
}
)
});
*/
}
//mysqlPaySetBillsStatus(billId)
myMultiFunc('billId');
// MYSQL_INSERT_LoginSteamSession(ip, steam, refreshToken, token, role)
myMultiFunc('ip', 'steam', 'refreshToken', 'token', 'role');
// mysqlPayAddBill(steamId, billId, payment, amount, time, status)
myMultiFunc('steamId','billId','payment','amount','time','status');
Отлаживать такое "добро" конечно и врагу не пожелаешь, плюс к этому варианты с одинаковым количеством аргументов различить не получится, поэтому можно принять соглашение о вызове - при вызове мультифункции, первый параметр - мнемоника операции
myMultiFunc('PaySetBillsStatus', 'billId');
myMultiFunc('LoginSteamSession','ip', 'steam', 'refreshToken', 'token', 'role');
myMultiFunc('PayAddBill','steamId','billId','payment','amount','time','status');
myMultiFunc('PayGetBills');
myMultiFunc('PayGetBillsNow');