2016-07-29 30 views
0

Ich habe den folgenden Code. Gibt es einen besseren Weg, es zu schreiben? Es fühlt sich an, als wenn Bedingungen und Versprechen und Abfragen von mehreren Tabellen beteiligt sind, wird der Code schwerer zu lesen. Jede Hilfe wäre willkommen. Vielen Dank!Wie kann ich besser lesbare Versprechen nutzen?

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

Code Review-Fragen sind wahrscheinlich besser für http://codereview.stackexchange.com geeignet. –

+0

Dies könnte wahrscheinlich mit einer einzigen Join-Abfrage –

+0

Thanks @ T.J.Crowder Ich werde sie von jetzt an dort veröffentlichen – rampr

Antwort

0

Statt mit jeder Anforderung die Einrückungsebene erhöhen, können Sie die Anfrage an die Urverheißung Kette zurückzukehren und ein then dort hinzuzufügen. Wie folgt aus:

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

Problem mit diesem Ansatz die null, die von den ersten then zurückgeführt werden kann, muss durch die zweiten geleitet werden (und die dritten, vierten, usw., wenn Sie einige haben). Eine alternative Methode wäre gewesen Ausnahmen statt Rückkehr null zu verwenden:

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

Eine Möglichkeit, die Lesbarkeit zu erhöhen, ist auf separaten Teil des Codes in eine eigene Funktion.

Ich weiß nicht, was diese Funktion tut, also werde ich es einfach doSomething nennen. Wenn Sie das durch etwas Beschreibendes ersetzen, ist es einfacher, an zwei Stellen zu lesen: Die Funktion selbst beschreibt den Code, den sie enthält, und der Aufruf der Funktion zeigt an, was in diesem Schritt im aufrufenden Code passiert.

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