Цепные обещания в классе без использования .then - PullRequest
0 голосов
/ 23 сентября 2018

Это часть более крупной проблемы, но как я могу связать вызовы методов в классе, когда для получения данных требуется promise для получения данных.

Следующее не будет работать, когда this.promise присваивается каждый раз, функция уже вернулась с this

class Test {
  constructor(promise) {
    this.promise = promise;
  }

  add(x) {
    this.promise.then(y => {
      this.promise = new Promise(resolve => {
        resolve(x + y);
      });
    });
    return this;
  }

  multiply(x) {
    this.promise.then(y => {
      this.promise = new Promise(resolve => {
        resolve(x * y);
      });
    });
    return this;
  }

  answer() {
    this.promise.then(x => {
      console.log(x);
    });
  }
}

function getNumber(num) {
 const promise = new Promise(resolve => {
   resolve(num);
 });
 return new Test(promise);
}

const num = getNumber(30);
num.add(20).multiply(2).answer();  // Outputs 33 instead of 100: (30 + 20) * 2

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Вы можете просто переназначить результат then (что является еще одним обещанием) на this.promise в методах.Это гарантирует, что this.promise всегда будет последним обещанием в цепочке.

class Test {
    constructor(promise) {
      this.promise = promise;
    }
  
    add(x) {
      const promise = this.promise.then(num => num + x)
      return new Test(promise);
    }
  
    multiply(x) {
      const promise = this.promise.then(num =>  x * num)
      return new Test(promise);
    }
  
    answer() {
      this.promise.then(console.log)
    }
  }
  
  function getNumber(num) {
   const promise = new Promise(resolve => {
     resolve(num);
   });
   return new Test(promise);
  }
  
  const num = getNumber(30);
  num.add(20).multiply(2).answer();  // Outputs 100: (30 + 20) * 2
  num.add(5).multiply(3).answer();  // Outputs 105: (30 + 5) * 3
  
0 голосов
/ 23 сентября 2018

Я бы не стал переназначать this.promise.Я бы не сделал это членом вашего класса.Вам просто нужно, чтобы ваши методы возвращали обещание.

Если вы хотите избежать использования .then, посмотрите на использование async / await.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...