J'essaie donc de récupérer tous les "lieux" étant donné leur emplacement dans React Native via l'API Google Places. Le problème est qu'après avoir effectué le premier appel à l'API, Google ne renvoie que 20 entrées , puis renvoie un next_page_token
, à ajouter au même appel d'API url
. Donc, je fais une autre demande pour obtenir les 20 prochains emplacements juste après, mais il y a un petit délai (1-3 secondes) jusqu'à ce que le jeton devienne réellement valide, donc ma demande est erronée.
J'ai essayé de faire:
this.setTimeout(() => {this.setState({timePassed: true})}, 3000);
Mais il est complètement ignoré par l'application ... des suggestions?
Mise à jour
Je le fais dans ma fonction componentWillMount
(après avoir bien sûr défini les variables), et j'appelle le setTimeout
juste après cette ligne.
axios.get(baseUrl)
.then((response) => {
this.setState({places: response.data.results, nextPageToken: response.data.next_page_token });
});
Ce que j'ai compris, c'est que vous essayez de faire une extraction basée sur le résultat d'une autre extraction. Donc, votre solution consiste à utiliser un TimeOut pour deviner quand la demande se terminera et ensuite faire une autre demande, non?
Si oui, ce n'est peut-être pas la meilleure solution à votre problème. Mais le code suivant explique comment utiliser les délais d'attente:
// Without "this"
setTimeout(someMethod,
2000
)
L'approche que je prendrais est d'attendre la fin de la récupération, puis j'utiliserais à nouveau le rappel pour la même récupération avec des paramètres différents, dans votre cas, le nextPageToken
. Je le fais en utilisant la syntaxe asynchrone & wait ES7.
// Remember to add some stop condition on this recursive method.
async fetchData(nextPageToken){
try {
var result = await fetch(URL)
// Do whatever you want with this result, including getting the next token or updating the UI (via setting the State)
fetchData(result.nextPageToken)
} catch(e){
// Show an error message
}
}
Si j'ai mal compris quelque chose ou si vous avez des questions, n'hésitez pas à demander!
J'espère que ça aide.
essayez ça a fonctionné pour moi:
async componentDidMount() {
const data = await this.performTimeConsumingTask();
if (data !== null) {
// alert('Moved to next Screen here');
this.props.navigator.Push({
screen:"Project1.AuthScreen"})
}
}
performTimeConsumingTask = async() => {
return new Promise((resolve) =>
setTimeout(
() => { resolve('result') },
3000
)
);
}