web-dev-qa-db-fra.com

Liaison d'une fonction de gestionnaire de promesses à un objet

J'ai du code comme:

var bar = foo().then(function success(value) {
  // compute something from a value...
}, function failure(reason) {
  // handle an error...
});

Comment lier la fonction failure à l'objet this dans le contexte de bar. Je sais que je devrai utiliser myFunc.bind(this) mais que dois-je substituer à la place de myFunc?

16

Vous pouvez utiliser bind comme ceci:

var bar = foo().then(function success(value) {
  // compute something from a value...
}, function failure(reason) {
  // handle an error...
}.bind(this));
39
robertklep

Vous disposez actuellement d'une fonction anonyme (bien qu'étiquetée) pour votre rappel d'échec:

function failure(reason) {
   // handle an error...
}

Comme le dit robertklep, vous pouvez immédiatement appeler .bind sur cette fonction anonyme. Cependant, il pourrait être plus lisible d'utiliser une fonction nommée à la place et de la transmettre à .then() en tant que variable:

function success(value) {
    // compute something from a value...
}
function failure(reason) {
    // handle an error...
}
var bar = foo().then(success, failure.bind(this));
6
IMSoP

Ce que j’ai trouvé très utile, c’est de lier chaque gestionnaire [function] de then() à un objet vide, afin que chaque fonction puisse y accéder. Ensuite, l'utilisateur peut définir et obtenir les propriétés de chaque mot-clé Promise par this. Les cadres de tests unitaires fonctionnent de la même manière.

    chainPromiseList([getName,getAge],finalDone,rejectHandle);

    function chainPromiseList(promiseList,finalDone,errHandle){
      var userContext = new UserContext();
      if(typeof finalDone==='function') promiseList.Push(finalDone);
      if(typeof errHandle==='function') promiseList.Push(errHandle);
      return promiseList.reduce((total,curVal,curInd,arr)=>{
        var last = curInd+1===arr.length;
        var method = last&&typeof errHandle==='function' ? 'catch':'then';
        var concatenated = total[method](curVal.bind(userContext));
        return concatenated;
      },Promise.resolve());
        function UserContext(){};
    }
    
    function getName(){
      return new Promise((resolve,reject)=>{
        setTimeout(()=>{
          console.log('got name!');
          this.name = 'Paul';
          resolve();
        },500);
      });
    }

    function getAge(){
      return new Promise((resolve,reject)=>{
        setTimeout(()=>{
          console.log('got age!');
          this.age = 26;
          resolve();
        },500);
      });
    }

    function finalDone(){
      console.log(`Hello, I'm ${this.name} and I'm ${this.age}yo.`);
    }

    function rejectHandle(msg){
      console.log('Error: ',msg);
    }

0
Paweł