Save handler without a nested "deferred antipattern"
You can also leave out reject. Your code would look like:

function save() {
    return confirm().then(function(response) {
        return commit();
    });
};


The promise returned by then() will automatically be rejected if the promise returned by confirm() is rejected.

Combining with @ShaunH's answer you would be left with

function save() {
    return confirm().then(commit);
};