我正在开发Express nodeJS Web应用程序,并试图增加我对异步编程的知识以及如何正确访问所需的数据。
我有两个查询SQL数据库的回调函数。我的函数声明如下:
function CustomerList(callback) {
const db = require('../db');
db.query('SELECT * FROM users WHERE role = (?)', ['User'], (error, results, fields) => {
if (error) throw error;
callback(results);
});
}
function AdminList(callback) {
const db = require('../db');
db.query('SELECT * FROM admins WHERE role = (?)', ['Moderator'], (error, results, fields) => {
if (error) throw error;
callback(results);
});
}
我使用从两个回调中检索到的数据,并将其发送到我的视图引擎模板中,如下所示:
CustomerList((userData) => {
AdminList((adminData) => {
res.render('adminhome', {
title: 'Admin - Home',
results: 'test',
customers: userData,
admins: adminData
});
});
这可以按预期工作,我可以操纵数据,但是请在视图模板上。但是...这似乎很“笨拙”,如果我创建其他函数来检索更多数据,然后继续嵌套其他回调以传递该参数,则我觉得我正在使用的这种方法将来会给我带来麻烦。数据添加到我的视图模板。
本质上,我正在努力寻找一种合适的方法来检索UserData结果和AdminData结果并将它们传递给我的res.render API调用。
有什么比我目前的方法更好的选择?
答案 0 :(得分:1)
是的,如果您在回调中调用多个回调,并使用promises(async / await),则会创建回调地狱
const util = require('util');
const db = require('../db');
const query = util.promisify(db.query);
const getData = async () => {
try {
const CustomerList = await query('SELECT * FROM users WHERE role = (?)', ['User']);
const AdminList = await query('SELECT * FROM admins WHERE role = (?)', ['Moderator']);
// OR Promise.all
const [CustomerList, AdminList] = await Promise.all([
query('SELECT * FROM users WHERE role = (?)', ['User']),
query('SELECT * FROM admins WHERE role = (?)', ['Moderator'])
]);
} catch (error) {
console.log(error);
}
}