33 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			33 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			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
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// Make a change that we optimistically show to the user as successful, but which
 | 
						|
// actually depends on a network operation. In the unlikely event that the network
 | 
						|
// operation fails, revert the changes
 | 
						|
export async function optimisticUpdate (doImmediately, networkUpdater, onSuccess, onFailure) {
 | 
						|
  let networkPromise = networkUpdater()
 | 
						|
  doImmediately()
 | 
						|
  try {
 | 
						|
    let response = await networkPromise
 | 
						|
    onSuccess(response)
 | 
						|
  } catch (e) {
 | 
						|
    console.error(e)
 | 
						|
    onFailure(e)
 | 
						|
  }
 | 
						|
}
 |