combine async tasks into a promise