2016-07-29 2 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)); 
} 

Проблема с этим подходом, null, которые могут быть возвращены по первому then должен быть пропущен через второй (и третий, четвертый и т.д., если у вас немного). Альтернативный метод был бы использовать исключение вместо возврата нуля:

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