change to anync & add wait method