finish the basic version of async callback