Edit in JSFiddle

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