如何利用承诺更具可读性?

时间:2016-07-29 13:07:00

标签: javascript promise refactoring

我有以下代码。有没有更好的方法来写它。感觉就像涉及多个表的条件和承诺以及查询一样,代码变得更难以阅读。任何帮助,将不胜感激。谢谢!

fetchUserById = function (id) {
    var user = {};

    return knex_instance('user_info')
      .where('id', id)
      .first()
      .then(function (data) {
        if (!data) {
          return null;
        } else {
          user.info = data;
          return knex_instance('user_table')
            .where('id', id)
            .first()
            .then(function (values) {
              user.values = values;
              return user;
            });
        }
      })
      .catch(errorHandler('fetchUserById', id));
  }

2 个答案:

答案 0 :(得分:0)

您可以将请求返回到原始承诺链并在其中添加then,而不是增加每个请求的缩进级别。像这样:

fetchUserById = function(id) {
  var user = {};

  return knex_instance('user_info').where('id', id).first()
    .then(function(data) {
      if (!data) 
        return null;
      user.info = data;
      return knex_instance('user_table').where('id', id).first();
    })
    .then(function(values) {
      if (!values) 
        return null;
      user.values = values;
      return user;
    });
    .catch(errorHandler('fetchUserById', id));
}

这种方法出现问题,第一个null可以返回的then必须通过第二个(和第三个,第四个,等等,如果你有的话)。另一种方法是使用异常而不是返回null:

fetchUserById = function(id) {
  var user = {};

  return knex_instance('user_info').where('id', id).first()
    .then(function(data) {
      if (!data) 
        throw "NO_USER_INFO";
      user.info = data;
      return knex_instance('user_table').where('id', id).first();
    })
    .then(function(values) {
      user.values = values;
      return user;
    });
    .catch(function(err) {
      if (err==="NO_USER_INFO")
        return null;
      else
        return errorHandler('fetchUserById', id);
    }
}

答案 1 :(得分:0)

提高可读性的一种方法是将部分代码分离到自己的函数中。

我不知道这个功能是做什么的,所以我只是打电话给它doSomething。如果用描述性的内容替换它,它在两个地方更容易阅读:函数本身描述它包含的代码,对函数的调用表明调用代码中该步骤发生了什么。 / p>

function doSomething(data)
{
    if (!data) {
        return null;
      } else {
        user.info = data;
        return knex_instance('user_table')
          .where('id', id)
          .first()
          .then(function (values) {
            user.values = values;
            return user;
      }
}

fetchUserById = function (id) {
  var user = {};

  return knex_instance('user_info')
    .where('id', id)
    .first()
    .then(doSomething)
    .catch(errorHandler('fetchUserById', id));
}