1. Create a CommandChain, populate it with AsyncCommandChainSteps, and start it2.
2. The first one completes OK, so the second one starts
3. The second one completes OK so the result handler is invoked, but in the result handler, call error() on the step
4. error() dispatches the chain failed event and marks the chain as complete
5. After the result handler invoked in step 3 is done, the chain runs proceed() and keeps going because the current position (2 out of 3) isn't the last step yet
There are a few ways this could be handled. My take is that the easiest option, and the one that would handle this for most/all cases, is the add a check on isComplete to the AbstractChain proceed() method, so the chain only proceeds if it is not complete yet: