javascript Promise chaining: augmenting the unique argument

There are two things that, IMHO, make code cleaner when using Promises Idioma:

  1. use an unique object argument (and its attributes as you would use argument legacy)
  2. return resolve with the object given as argument augmented by attribute of the action executed by the function

i.e., say I want to ask db for data about a person, I define the method (function) that got an object {person: {personstruct}} and return the augmented object {person:{personstruct}, contactdata: {contactdatastruct}}

 

function addContactData(o){
   return new Promise(function(resolve,reject) {
     //check existense of attributes, reject with reason
     mysql.query({sql:"select * from cdata where pid=?",values:[o.person.pid]},function(err,rows) {
       if(err) {
          o.err = err.toString();
          reject(o);
       } else {
          if(rows.length>0) {
            o.contactdata = rows[0];
          } else {
            o.contactdata = null;
          }
          resolve(o);
       }
     });
   });
}

 That could look not very optimized but it is a practice that make things look cleaner and consistent. Pros:

  1. testing is simply composable, just pass some good object and test if it augments: there is an idioma testing
  2. you have no surprise
  3. you have not to deal with "how do I access previous promise result in a .then() chain" problem, where Bergi show some drawback with this solution, that really are worth paying for the cleaness

Also object is passed by reference, and test on required attributes is a matter of enstabilish a protocol, like attrlist with type required.

Note: image source http://www.geograph.org.uk/photo/1804846 chain at the launch of SS Great Eastern (sailing ship), Isle of Dogs, England