2016-07-29 6 views
0

私は次のコードを持っています。それを書く良い方法はありますか?複数のテーブルからの条件や約束などが関係している場合、コードは読みにくくなります。どんな助けもありがとう。ありがとう!私は約束をもっと読みやすくすることができますか?

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)); 
    } 
+4

コードレビューの質問はおそらくhttp://codereview.stackexchange.comに適しています。 –

+0

これはおそらく単一の結合クエリで達成することができます –

+0

Thanks @ T.J.Crowderここからそれらを投稿します – rampr

答えて

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

問題、最初のthenによって返すことができnullは、第1に通過しなければなりません。別の方法ではなく、ヌルを返すの例外を使用することであっただろう:可読性を高めるために

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); 
    } 
} 
0

一つの方法は、独自の関数にコードの一部を分離することです。

私はこの機能が何であるかわからないので、私はそれをdoSomethingと呼ぶつもりです。その内容をわかりやすいものに置き換えると、2つの場所で読みやすくなります。関数自体にはコードが記述されています。関数の呼び出しは、呼び出しコードのそのステップで何が起きているかを示します。

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)); 
} 
関連する問題