hydra_13
@hydra_13
Пограммист - любитель)

Как решить задачу с Promise?

Всем привет.
Сегодня озадачился следующим:
var d = new deferred();
d.then(function(res){ console.log("1 ", res); return "x"; });
d.then(function(res){ console.log("2 ", res); return "b"; });
d.then(function(res){ console.log("3 ", res); return "c"; });
d.resolve("hello");

Как нужно реализовать deferred() чтобы получился следующий вывод:
1 hello
2 x
3 b

В JavaScript не силен, т.к. по большей степени работаю с C++ и Qt. Нашел информацию по Promise, но во всех примерах используется:
var promise = new Promise(function(resolve, reject) {
  resolve('Success!');
});

Как сделать именно через deferred() пока не понял
  • Вопрос задан
  • 182 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
В конструкторе создаём promise, делаем его свойством экземпляра, также делаем свойством экземпляра функцию, разрешающую promise; метод then - вызываем метод then у сохранённого promise, пробрасывая ему полученный параметр, результат вызова кладём на место сохранённого promise:

class deferred {
  constructor() {
    this.promise = new Promise(resolve => this.resolve = resolve);
  }

  then(f) {
    this.promise = this.promise.then(f);
  }
}

Но вообще, можно добиться того же поведения и без использования promise. Сохраняем в массив все передаваемые в then функции, при вызове resolve перебираем этот массив, вызываем функции, результат вызова предыдущий используем как параметр следующей:

class deferred {
  constructor() {
    this.callbacks = [];
  }

  then(f) {
    this.callbacks.push(f);
  }

  resolve(val) {
    this.callbacks.reduce((res, f) => f(res), val);
  }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
02 нояб. 2024, в 21:08
2000000 руб./за проект
02 нояб. 2024, в 20:34
40000 руб./за проект
02 нояб. 2024, в 20:05
800 руб./в час