add cache and promise