Shouldn't it be like
doE: doC, doB, doA doD: doB
etc?
anyways the problem with this approach is that doD() is assumed to be a general function (or statement or async command) that is not by definition bound to doB(), but rather in this specific case we need it to be executed after doB() is done.