Объединение нескольких асинхронных функций в javascript - PullRequest
2 голосов
/ 03 марта 2020
class Calc {
  constructor(num) {
    this.num = num;
  }

  add() {
    // code
  }

  subtract() {
    // code
  }

  multiply() {
    // code
  }

  divide() {
    // code
  }
}

const getRes = async () => {
  const res = await new Calc(10)
    .add(30)
    .subtract(5)
    .multiply(2);

    console.log(res) //prints the result
};

getRes();

Как мне добиться этого поведения? Я хочу иметь возможность связывать все методы (которые в этом примере являются сложением, вычитанием, умножением, делением) один за другим, и когда я жду их, он должен возвращать результат так же, как когда мы await mon goose запросов.

Я знаю, что обычные вычисления не являются асинхронными, но представьте, что методы были асинхронными - какой будет правильный код для достижения желаемого эффекта как?

1 Ответ

4 голосов
/ 03 марта 2020

Вы можете вернуть объект с методами add, subtract, et c. Когда эти методы вызываются, переназначьте внутреннее свойство экземпляра, в котором содержится Обещание. В конце цепочки получите доступ к этому свойству Promise в экземпляре:

class Calc {
  constructor(num) {
    this.prom = Promise.resolve(num);
  }

  add(arg) {
    this.prom = this.prom.then(res => res + arg);
    return this;
  }

  subtract(arg) {
    this.prom = this.prom.then(res => res - arg);
    return this;
  }

  multiply(arg) {
    this.prom = this.prom.then(res => res * arg);
    return this;
  }
}

const getRes = async () => {
  const res = await new Calc(10)
    .add(30)
    .subtract(5)
    .multiply(2)
    .prom;

    console.log(res) //prints the result
};

getRes();
...