web-dev-qa-db-fra.com

React Native - Récupérer l'appel mis en cache

Je crée une application en natif réactif qui effectue des appels de récupération qui s'appuient sur les informations les plus récentes du serveur. J'ai remarqué qu'il semble mettre en cache la réponse et si je lance à nouveau cet appel de récupération, il renvoie la réponse en cache plutôt que les nouvelles informations de mon serveur.

Ma fonction est la suivante:

goToAll() {
  AsyncStorage.getItem('FBId')
    .then((value) => {
      api.loadCurrentUser(value)
        .then((res) => {
          api.loadContent(res['RegisteredUser']['id'])
            .then((res2) => {
              console.log(res2);
              this.props.navigator.Push({
                component: ContentList,
                title: 'All',
                passProps: {
              content: res2,
            user: res['RegisteredUser']['id']
          }
        })
      });
    });
  })
  .catch((error) => {console.log(error);})
  .done();
}

et la fonction de api.js im appel est la suivante:

loadContent(userid){
  let url = `http://####.com/api/loadContent?User_id=${userid}`;
  return fetch(url).then((response) => response.json());
}
26
Andrew Ives

Vous pouvez définir un Header pour empêcher la mise en cache de la demande. Exemple ci-dessous:

return fetch(url, {
  headers: {
    'Cache-Control': 'no-cache'
  }
}).then(function (res) {
  return res.json();
}).catch(function(error) {
  console.warn('Request Failed: ', error);
});
45
manosim

La réponse de Manosim n'a pas fonctionné pour moi, mais m'a mis sur la voie d'une solution qui ne fonctionne:

fetch(url, {
  headers: {
    'Cache-Control': 'no-cache, no-store, must-revalidate',
    'Pragma': 'no-cache',
    'Expires': 0
  }
})

Cela l'a cloué.

15
lance.dolan

J'ai eu un problème similaire avec react native (Android) et fetch en utilisant clojurescript (au lieu de js). L'ajout: le cache "no-store" (pas dans l'en-tête) a arrêté le comportement (mise en cache des données de récupération sur Android App).

Je pense que le code en js devrait être quelque chose comme:

fetch(url, {'cache':'no-store'})

les spécifications récupèrent le mode cache

0
fgui