Назначение функции обработчика обещаний объекту - программирование

Назначение функции обработчика обещаний объекту

У меня есть код вроде:

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

Как связать функцию failure с объектом this в контексте bar. Я знаю, что мне придется использовать myFunc.bind(this), но что я вместо вместо myFunc?

4b9b3361

Ответ 1

Вы можете использовать bind следующим образом:

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

Ответ 2

В настоящее время у вас есть анонимная (хотя и помеченная) функция для обратного вызова отказа:

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

Как говорит robertklep, вы можете сразу вызвать .bind эту анонимную функцию. Однако может быть более читаемым использовать именованную функцию вместо этого и передать ее в .then() как переменную:

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

Ответ 3

Мне было очень полезно связать каждый обработчик then() [function] с одним пустым объектом, поэтому каждая функция может иметь к нему доступ. Затем пользователь может установить и получить свойства в каждом обещании с помощью ключевого слова this. Рамки unit test работают аналогично.

    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);
    }