【问题标题】:multiple nested callback functions before parent's callback in javascriptjavascript中父回调之前的多个嵌套回调函数
【发布时间】:2016-05-28 21:47:25
【问题描述】:

我正在使用 expressjs 和 mysql 包。 我有一个用户表,每个用户可以有许多技能、项目、证书存储在不同的表中。如何将所有这些数据放入单个用户对象中。

getUserDataById(req.params.id, function (user) {
  if (user) {
    res.send(user);     
  }
}
var getUserDataById = function (id, callback) {
  connection.query(userSql, id, function (err, rows) {
    if (rows[0]) {
      user = new User(rows[0]); //parse row data to user obj  
      // The main problem 
      //get skills and projects.... and asign to user obj
      parseArrayData(skillSql, user.id, Skill, function (skills) {
          user.skills = skills;
        }
      );
      parseArrayData(projectSql, user.id, Project, function (project) {
          user.projects = projects;
        }
      );
      // is here
      callback(user);
    }
  });
}
var parseArrayData = function (query, id, Obj, callback) {
  connection.pool.query(query, id, function (err, rows) {
    if (err) {
      throw err;
    } else {
      console.log('rows',rows);
      var array = [];
      for (var i = 0; i < rows.length; i++) {
        array[i] = new Obj(rows[i]); // map obj's attributes with fields
      };
      callback(rows);
    }
  });       
};

【问题讨论】:

    标签: mysql node.js express


    【解决方案1】:

    您可能有这些不同的表(假设):usersskillsprojectscertifications

    从数据库中获取结果进行查询的函数;

    function executeQuery(tablename, userId, callback) {
      var sql = 'select * from ' + tablename + ' where id = ' + userId;
      connection.query(sql, function (err, rows) {
        if (err) { callback(err, null); }
        else { callback(null, rows); }
      })
    }
    

    获取用户 ID 的所有结果并返回 json 对象的函数;

     var getUserDataById = function (userId, callback) {
        executeQuery('users', userId, function(users) {
           executeQuery('projects', userId, function(projects) {
              executeQuery('skills', userId, function(skills) {
                 executeQuery('certifications', userId, function(certifications) {
                    var result = { // format you result.
                       id: userId,
                       users: users,
                       projects: projects,
                       skills: skills,
                       certifications: certifications
                    };
                    callback(result);
                 }); 
              });
           });
        });
        callback(null);
     });
    

    用法:

    getUserDataById(req.params.id, function (user) {
      if (user) {
        res.send(user);     
      }
    }
    

    【讨论】:

    • 谢谢@narainsagar。这可以帮助我解决我的问题。我发现promise 可以在这种情况下提供帮助。我会尝试这样解决它
    • 我使用回调是因为你没有提到 es6 或在代码中使用了 Promise。你的代码包含回调,所以我也使用了回调
    • 你能给我一个使用promise的建议吗?我很难从这个Q document 得到如何在节点中实现它
    • 我不太清楚,但这可能会有所帮助:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    • 而且我认为你不能直接通过节点运行 es6 (promises) 所以你可能需要设置和使用babel
    最近更新 更多