async hack, doesn't need to introduce a wasteful intermediate promise