67 votes

La promesse dans la promesse: quelle est la bonne façon de renvoyer une variable de la promesse faite par l'enfant? (JS)

J'ai une fonction comme celle-ci:

 function top() {

  //promise1
  ParentPromise({
    ...some code here...
  }).then(function() {


    //promise2
        ChildPromise({
          ..some code here...
        }).then(function(response) {
         var result = response.result.items;

        });

});

};
 

et je dois renvoyer la valeur de résultat de cette manière:

 var myresult = start();
 

Comment je peux faire ça? Merci

55voto

Katana314 Points 1980

La définition de promesses que vous ne pouvez pas littéralement attribuer result de myresult. Cependant, vous pouvez faire myresult une promesse qui résout directement à l' result pour l'appelant, cependant, beaucoup de promesses ont été utilisés pour l'obtenir. L'idée de base est que l'intérieur de chaque fonction dans votre bloc ci-dessus, vous devriez être en returning la prochaine Promesse de la chaîne. par exemple:

function top() {

  //promise1
  return ParentPromise({
    ...some code here...
  }).then(function() {


    //promise2
        return ChildPromise({
          ..some code here...
        }).then(function(response) {
         var result = response.result.items;
         return result;

        });

});

};

En fin de compte, le code appelant top() de ne pas savoir ou de soins que 1, 2 ou 12 enchaîné les promesses ont été utilisés pour obtenir de l' result. Il sera également en mesure d'enregistrer une erreur de rappel dans le cas où aucune de ces promesses échoué.

52voto

Erik Terwan Points 1768

Pas tout à fait sûr que cela fonctionne avec les promesses de JS natives, mais dans PromiseKit (rapide .. je sais, mais je suis presque sûr que cela devrait fonctionner), je suis habitué à retourner la deuxième promesse, et chaîne c'est comme ça:

 function top() {
  //promise1
  return ParentPromise({
    ...some code here...
  }).then(function() {
    //promise2
    return ChildPromise({
          ..some code here...
    })
  }).then(function(response) {
    var result = response.result.items;
    // do something with `result`

    return result;
  });
}

top().then(function(result){
  // all done 
});
 

Ou en notation ES6 / lambda;

 function top() {
  return ParentPromise().then(_ => {
    return ChildPromise()
  }).then(response => {
    return response.result.items
  })
}

top().then(items => {
  // all done 
})
 

0voto

Rob Brander Points 1861

Le problème ici est que vous essayez d'utiliser du code asynchrone de manière synchrone. Vous devrez changer votre façon de penser lorsque vous travaillez avec du code asynchrone.

Une façon de résoudre ce problème consiste à faire en sorte que top () renvoie ParentPromise, puis définissez la variable myresult à l'aide de .then () du retour de cette promesse.

 function top() {
  ...
  return ParentPromie;
}
var myresult = ''; // default value until you have resolved your promise
top().then(result => myresult = result);
 

Cependant, pour que cela fonctionne, vous devrez ajouter du code pour résoudre votre promesse:

 var ParentPromise = new Promise(function(resolve) { 
  ... some code...
  var ChildPromise = new Promise(function(){
    ...some code...
  }).then(function(response){
    resolve(response.result.items);
  });
});
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X