return a promise from "fetch" and adapt to async data source