rename forasync to forAsync and implement ifAsync