web-dev-qa-db-fra.com

comment affecter la valeur retournée d'une promesse à une variable?

MODIFIÉ sous forme de commentaire à dupliquer Je cite: [ Comment renvoyer la réponse d'un appel asynchrone?

Les promesses sont des conteneurs pour les valeurs futures. Lorsque la promesse reçoit la valeur (elle est résolue) ou lorsqu'elle est annulée (rejetée), elle avertit tous ses "écouteurs" qui souhaitent accéder à cette valeur.

Cette question concerne la façon de retourner la valeur contenue dans la promesse. La réponse m'a été utile, car elle a précisé qu'il n'est pas possible de retourner la valeur, plutôt d'accéder à la valeur à l'intérieur la fonction de promesse.

D'autres sources utiles sur le sujet, ici:

Ci-dessous la question d'origine:


Pourriez-vous s'il vous plaît aider à comprendre comment obtenir la valeur d'une promesse et les différences entre ces deux exemples?

//I have a simple ajax call like:

var fetch = function(start_node, end_node) {
var apiEndpoint = 'localhost/nodes/';
var loadurl = apiEndpoint+start_node+'/'+end_node;
return $.ajax({
    url: loadurl,
    type: 'GET',
    dataType: 'json',
    jsonpCallback: 'json'

  });

};
// Then I processed results in something like:
    var getResult = function(data) {
      // do smtg with data
      var result = {'myobject' : result_from_data}
      return result
    }

Et enfin, je veux lui attribuer des résultats.

Les travaux suivants, mais je pense que cela gaspille le concept de la promesse puisque le résultat est attribué à une variable globale déclarée avant:

var r;  
fetch('val1','val2')
.then(function(data){
  r = getResult(data);
})

Au lieu de cela, ce qui suit affecte la fonction de promesse à res.

var res = fetch('val1','val2')
.done(function(data){
  return getResult(data);
})

Pourriez-vous clarifier comment passer le 'myobject' à la variable res, et non à la promesse elle-même?

J'ai aussi essayé:

var res = $.when(fetch('val1','val2'))
.done(function(data){
  return getResult(data);
})

mais pas de succès.

16
user305883

Vous devez utiliser la variable globale ( astuce , ou accepter l'utilisation de l'astuce save-as-a-promise.

var getStuff = $.when(req1,req2).then(function(data1,data2) { return data1.concat(data2); });

//the variable getStuff is now a promise and any .then chained 
//to it will have data1.concat(data2) passed to it as an argument

getStuff
  .then(function(data1Data2) {
    console.log(data1Data2);
  });

//the next time you want to use it, you have to use the same promise-interface with .then
getStuff
  .then(function(data1Data2) {
    console.log(data1Data2);
  });
10
Adam