2017-10-16 3 views
0

Dans mon code simplifié:Reactjs - Méthode renvoie le résultat avant que l'appel d'API obtienne les données. (Toujours objet vide)

static getData(Id) { 
    const data = []; 
    api.getData(lId) 
    .then((Res) => { 
     data.push(Res); 
    }); 
    return data; 
} 

Le critère d'évaluation de l'API récupère les données, mais il prend un certain temps. la méthode retourne toujours [], mais si je mets un console.log (Res), les données sont là. Cela signifie que la méthode renvoie le const data = []; initial et n'attend pas que l'API renvoie les données.

Comment est-ce que je devrais résoudre ce problème?

Regrds

+0

En utilisant les promesses correctement. 'getData' doit retourner une promesse. Voir le duplicata. –

Répondre

1

Il y a un problème avec votre calendrier ici:

static getData(Id) { 
    const data = []; 
    api.getData(lId) 
    .then((Res) => { 
     data.push(Res); 
    }); 
    return data; <-- Gets returned before the promise resolves/rejects 
} 

Si vous devez faire un traitement supplémentaire sur vos données avant qu'il soit retourné à l'appelant - dans votre exemple, vous le mettez dans un tableau - vous allez besoin d'envelopper avec une autre promesse:

static getData(Id) { 
    return new Promise((resolve, reject) => { 
     api 
     .getData(Id) 
     .then((Res) => { 
      const data = [] 
      data.push(Res); 
      resolve(data) 
     }) 
     .catch(reject) 
    }) 
} 
1

Vous devez utiliser Promise.

Par exemple:

static getData(Id) { 
    return new Promise((resolve) => { 
    api.getData(Id) 
     .then((Res) => { 
     resolve(Res); 
     }); 
    }); 
} 

Et utiliser cette méthode comme ceci:

getData(15) 
    .then((data) => { 
    console.log(data); 
    }); 
+0

J'ai utilisé Promise, api est une promesse. – Adel

+0

Oui, et vous devriez utiliser une autre promesse car api fait l'appel asynchrone. –