use async for flow control