In the sync case we throw synchronously without executing any more here. But in the async case we `reject()` so the end() function returns `undefined`. Is that going to be ok?