Pinafore-Web-Client-Frontend/routes/_utils/sync.js

19 lines
736 B
JavaScript

// Hit both the cache and the network, setting state for the cached version first,
// then the network version (as it's assumed to be fresher). Also update the db afterwards.
export async function cacheFirstUpdateAfter (networkFetcher, dbFetcher, dbUpdater, stateSetter) {
let networkPromise = networkFetcher() // kick off network request immediately
let dbResponse
try {
dbResponse = await dbFetcher()
stateSetter(dbResponse)
} finally {
let fetchAndUpdatePromise = networkPromise.then(networkResponse => {
/* no await */ dbUpdater(networkResponse)
stateSetter(networkResponse)
})
if (!dbResponse) { // no cached result available, await the network
await fetchAndUpdatePromise
}
}
}