let something_ok = givePromiseFactory('something_ok ', true), somethingElse_ok = givePromiseFactory('somethingElse_ok ', true), anotherOne_err = givePromiseFactory('anotherOne_err ', false), fooOne_err = givePromiseFactory('fooOne_err ', false); console.clear(); something_ok() .then((v)=>{ return somethingElse_ok(v); }) .then((v)=>{ fooOne_err(v); }) .then(something_ok, somethingElse_ok) .then(anotherOne_err()) .then(something_ok, somethingElse_ok) function givePromiseFactory(label, result){ return function(value){ let waitTime = _.random(0.5, 3, true) * 1000; //let waitTime = 1; if(!value) value = 'undefinded'; console.log(` ${label} -- called with value: "${value}"`); return new Promise((resolve, reject)=>{ setTimeout(()=>{ if(result){ console.log(`Resolved -- ${label} `); resolve(`value from ${label}`); } else { console.log(`Rejected -- ${label}`); resolve(`reason from ${label}`); } }, waitTime); }); } }