One alternative to modifying code for multiple job functions might be to check a user cancelled flag between jobs. If the granularity of this kind of checking is not too course, then you could asynchronously set a (somewhat) global cancelled flag and proceed along the lines of:
let userCancelled = false;
let checkCancel = function( data) {
if( userCancelled)
throw new Error( "cancelled by user"); // invoke catch handling
return data; // pass through the data
}
myJob1()
.then(myJob2).then( checkCancel)
.then(myJob3).then( checkCancel)
.then(myJob4).then( checkCancel)
.then(myJob5).then( checkCancel)
.then(myJob6).then( checkCancel)
.catch(myJobError);
Don't forget that if you do check the cancelled flag inside a job, all you need to do is throw an error to have it bubble down the promise chain.