2016-07-29 62 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

感謝@ 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必須通過第二個傳遞(第三,第四等,如果你有一些)。另一種方法會一直使用異常,而不是返回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); 
    } 
} 
0

一個提高可讀性的方法是代碼的單獨部分到其自身的功能。

我不知道這個功能是幹什麼的,所以我打算叫它doSomething。如果你用描述性的東西替換它,在兩個地方更容易閱讀:函數本身描述了它包含的代碼,並且調用函數表明調用代碼中的那一步發生了什麼。

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