Events run synchronously. You cannot use promises in expressions since Construct checks the return value immediately after the function returns. Your expression kicks off a promise which runs asynchronously but the resolve value is never used by anything.
You've already found the solution - use the same model as AJAX where actions kick off asynchronous work and then fires triggers upon completion.