节点js正确的代码方式(范围)

时间:2016-11-22 13:20:24

标签: javascript node.js

我是js的新手。在我的项目中,我使用的是mysql和node js。 在控制器的某个地方我需要从不同的模型中获取一些数据。在php中它看起来像

function some() {
    $user = $user->getOne($id); 
    $photos = $photos->getOne($user->id);
    $posts  = $post($user->id, $photo->uid)
}

我在一个范围内拥有所有这些变量 在节点js中,模型的结果是异步的,所以它看起来像嵌套回调。 简短的例子

UserModel.findbyid(result.user_id, function (err, user_data) {
  PhotoModel.GetVoteCount(user_data.id, result.id, function (res_count) {
    PhotoModel.getWinners(function (err, winners_ar) {
      PhotoModel.getweekusers(1, function (result_week) {
        response.render('one.twig', {
          view_user: request.user,
          image: result,
          p_user: user_data,
          count: res_count,
          winners: winners_ar,
          week_users: result_week['photos']
        });
      });
    })
  });
});
所以我有嵌套的回调,我觉得这不是正确的编码方式,你能解释一下最佳实践吗?

3 个答案:

答案 0 :(得分:0)

您可以查看async module

这简化了你所说的" callback hell"通过一些有助于在异步代码中创建流的函数。

特别针对您的情况 - async.waterfall将起作用

答案 1 :(得分:0)

您有两种选择:

  1. 使用异步模块(async
  2. 使用返回承诺的库(如promise-mysql)。

答案 2 :(得分:0)

使用promises或帮助您使用promises的库。