2017-06-02 1 views
2

J'ai un problème lors de la conversion de la promesse renvoyée par le service au contrôleur. Ce que je veux, c'est créer un tableau d'objets JSON à partir des données contenues dans la promesse. Voici ce que je reçois dans le contrôleur: Data received at controllerConversion d'une promesse dans un objet JSON

Voici la ligne qui est utilisée pour l'impression que les données:

console.log("controller unmatched: ", unmatched.getData(sFilter)); 

ici « inégalée » est le service et getData() est sa fonction.

Merci!

+2

demandez-vous comment obtenir les données d'une réponse? En supposant que vous résolvez la réponse de '$ http' sans aucune modification, ce serait juste' Service.someRequest (params) .then (fonction (réponse) {$ scope.data = response.data;}, function (err) {/* faire quelque chose avec err * /}); ' –

Répondre

1

Je crois que ce que vous voulez vraiment faire est de sauver une valeur que la promesse de résoudre, pas la promesse elle-même.

unmatched.getData(sFilter).then(response => { 
    const json = JSON.stringify(response); 
}); 

Ceci est dû à la nature des promesses - elles sont asynchrones.

L'objet Promise représente l'achèvement (ou l'échec) éventuel d'une opération asynchrone et sa valeur résultante.

Source: Promises on MDN

2

Promesses travailler async:

unmatched 
    .getData(sFilter) 

    // wait for its resolution 
    .then(data => console.log(JSON.stringify(data)) 
; 
+0

notez que la compression des données dans cet exemple est seulement si elle est facile à lire. Il est inutile lorsque vous souhaitez accéder aux membres des données renvoyées. – Shmoopy

+0

Qu'avez-vous dit? Je voulais seulement enregistrer le résultat, en expliquant comment gérer les valeurs renvoyées 'Promise' ... c'était juste un exemple, vous pouvez faire ce que vous voulez avec les données retournées. – Hitmands

6

A Promise représente une valeur qui sera disponible peu de temps à l'avenir, ou jamais. Cela signifie que sa valeur finale ne peut pas être renvoyée par votre fonction unmatched.getData().

Ce que vous devez faire est de faire unmatched.getData() retourner la promesse réelle et vous prenez des mesures lorsque cette promesse résout:

unmatched.getData(sFilter).then(function(result) { 
    console.log("controller unmatched: ", result); 
}); 
+0

Merci! Si je veux sauvegarder ces données dans une variable, devrais-je utiliser $ scope, et pourrais-je y accéder depuis l'extérieur de cette fonction? – VitezKoja

+0

avec esnext vous pouvez faire: 'const data = wait unmatched.getData (sFilter);' – Hitmands

+0

@VitezKoja Toute variable déclarée dans la portée externe. Comme une propriété sur '$ scope' accomplit ceci. La chose importante à garder à l'esprit est que toute action qui dépend de cette variable doit être prise lorsque la promesse a été résolue, pas avant. –

0

si vous voulez obtenir les objets JSON de la promesse, je pense que vous pouvez utiliser la ligne ci-dessous le code de

response.json()