Цепные обещания в классе без использования .then

1

Это часть более крупной проблемы, но как я могу подключить метод вызовов к классу, когда им требуется 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
Теги:
es6-promise
es6-class

2 ответа

1
Лучший ответ

Вы можете просто переназначить результат 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
    Отлично, это хороший шаг в правильном направлении. Что-то, что я не объяснил полностью, мне нужно, чтобы оно было неизменным. Поэтому, если мы запустим num.add(5).multiply(3).answer(); в конце он не начнется с 30 . Теперь начнется с последнего номера
  • 1
    Ох .... у меня это есть. Я просто верну new Test(promise) после каждого вызова функции
0

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

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

  • 0
    Цель состоит в том, чтобы связать вызовы функций, как это делают многие библиотеки, например, rxjs. num.add(20).multiply(2).answer(); на num.add(20).multiply(2).answer(); стал бы очень неаккуратно , если после каждого вызова функции вам пришлось обращаться then
  • 0
    @tic посмотрите на async / await.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню