 <p>Instead of increasing the indentation level with each request, you can return the request to the original promise chain and add a <code>then</code> there. Like this:</p> <pre><code>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)); } </code></pre> <p>Problem with this approach, the <code>null</code> that can be returned by the first <code>then</code> must be passed through the second one (and the third, fourth, etc, if you had some). An alternate method would have been to use exceptions instead of returning null:</p> <pre><code>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); } } </code></pre>