从多个回调访问数据

时间:2018-07-16 14:19:30

标签: node.js express asynchronous

我正在开发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调用。

有什么比我目前的方法更好的选择?

1 个答案:

答案 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);
    }
}