J'ai cette action en magasin
async post(endpoint, params) { await fetch(this.url + endpoint, { 'method': 'POST', headers: this.headers, body: JSON.stringify(params), }) .then(response => { return response.json(); }) .then( (data) => { this.returnData = data.data; }) .catch(error => { console.log(error); }); return this.returnData; }
et cette fonction dans une autre classe importée pour stocker
actions: { testLogin(context, credentials) { const loginService = new FetchClient(); let d = loginService.post('login', credentials); console.log(d); },
Et j'obtiens Promise {<pending>}
que je peux extraire des données de l'intérieur de la classe de récupération, mais je ne peux pas accéder aux données si je suis dans le magasin parce que c'est une promesse pas un objet. Comment puis-je résoudre ça?
3 Réponses :
Placez l'instruction return dans le second bloc then
:
post(endpoint, params) .then(data => {// do something with data}) .catch(error => { error.message; // 'An error has occurred: 404' });
Je vous recommande même d'utiliser le code suivant pour une meilleure lisibilité:
async post(endpoint, params) { const response = await fetch(this.url + endpoint, { 'method': 'POST', headers: this.headers, body: JSON.stringify(params), }) if (!response.ok) { const message = `An error has occured: ${response.status}`; throw new Error(message); } const resp_data = await response.json() return resp_data.data }
Puis appelez votre méthode comme ceci:
async post(endpoint, params) { await fetch(this.url + endpoint, { 'method': 'POST', headers: this.headers, body: JSON.stringify(params), }) .then(response => { return response.json(); }) .then( (data) => { this.returnData = data.data; return this.returnData; }) .catch(error => { console.log(error); }); }
reportez-vous à ce guide async / await
Je peux recommander de toujours ajouter un bloc try / catch afin de mieux gérer les erreurs.
Peux-tu essayer:
async testLogin(context, credentials) { const loginService = new FetchClient(); let d = await loginService.post('login', credentials); console.log(d); }
Il enregistre les données mais dans le fichier js, je l'utilise, je le trouve retourné comme promesse et non comme données
As @Ayudh mentioned, try the following code: async post(endpoint, params) { try{ let response = await fetch(this.url + endpoint, { 'method': 'POST', headers: this.headers, body: JSON.stringify(params), }); let data = await response.json(); this.returnData = data.data; }catch(e){ console.log(e); } return this.returnData; }
Comme les méthodes
async
renvoient des promesses, vous devez travailler avec cela.En termes simples, un résultat asynchrone ne peut pas être rendu synchrone sans un voyage psychique ou dans le temps - javascript ne contient ni l'un ni l'autre