I have tried using async await for tweens and animations. This is probably not its true intended use, but it served its purpose to flatten out such callback hell.
Create a promisifier for phaser signal
* Convert a phaser event(signal) to promise(for use with async/await)
* @param awaitSignal Phaser Signal
function signalAsync(awaitSignal: Phaser.Signal)
return new Promise((resolve, reject) =>
}) as Promise<Phaser.Signal>
Usage for an array of animations
async function animateAsync(animationSequence: Phaser.Animation)
for (const animation of animationSequence)
Besides the need for async await and Promise support/shim/transpile for some browsers, one major pitfall of this approach is it will hard to cancel if the chain gets big, probably has to create some kind of cancellation token which can be tedious.