For composability in JS I use small utility modules like "inOrder":
function beforeWifeComesHome() {
takeTheTrashOut();
function takeTheTrashOut() {
inOrder([openDoor, goOut, emptyTrash, goIn, closeDoor]);
}
}
But it would be easier to let the compiler take care of the async calls and insert callbacks automatically so that you can think synchronously while the program works asynchronously. And if you want to run stuff in parallel you should use child processes.