我有以下代码。有没有更好的方法来写它。感觉就像涉及多个表的条件和承诺以及查询一样,代码变得更难以阅读。任何帮助,将不胜感激。谢谢!
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));
}
答案 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));
}