can we make `action` return a promise instead of using a callback-based API?