In the code below, I am calling Pouch.sync(), to which I chain deleteLocal(). Pouch.sync() executes localDb.sync(), which does not return a promise, but I can attach a .on() event handler to handle errors. 
I've tried playing around with $q.when and $q.reject, but I can't seem to prevent deleteLocal() from firing if the sync fails, and onError() never executes (either as an error callback or in the catch statement).
// Controller
function _onSyncClick() {
    return Pouch.sync()
        .then(deleteLocal, onError); // I do not want deleteLocal() to execute if Pouch.sync() fails
        .catch(onError); 
}
// Pouch service
function sync() {
    return 
        localDb.sync(remoteDb) 
            .on('error', function (err) {
                return $q.reject('Sync error.');
            });
}
 
     
    