user_of_toster
@user_of_toster

Откуда брать коллбек из возвращенного промиса?

Много раз пробовал читать всевозможные имплементации, но они пока очень тяжелы для понимания.

Реализовываю свою версию промисов, идея проста:
После выполнения функции-executor срабатывает коллбек, который выполняет resolve().

Метод then срабатывает так
1) если промис зарезолвнутый - то выполняется сразу коллбек внутри then;
2) если промис не зарезолвнутый - то коллбек сохраняется, отдаётся пустой промис. Когда executor выполнится, то он запустит сохраненный коллбек.

Вопрос - иногда содержимое then отдает промис. Как отследить выполнение этого промиса, чтобы зарезолвить предыдущий промис? Откуда брать коллбек?

'use strict'

function MyPromise (fn) {
  this.executor_link = fn;


  this.state = 'pending';
  this.value = null

  this.reject = function(error) {
    this.value = error;
    this.state = 'rejected';
    if (this.saved_promise) {
      this.saved_err_callback();
      this.saved_promise.reject();
    }
  }

  this.resolve = function (val) {
    this.value = val;
    this.state = 'resolved';
    if (this.saved_promise) {
      let got_promise = this.saved_ok_callback(this.value);
      

      if (got_promise) {
        console.log(got_promise); // откуда брать коллбек из этого промиса? Чтобы потом зарезолвить как в строке ниже
      } else {
        this.saved_promise.resolve(this.value);
      }
  }
}
  

  this.then = function (ok_callback, err_callback) {
    if (this.state == 'pending') {
      this.saved_promise = new MyPromise(() => {});
      this.saved_ok_callback = ok_callback;
      this.saved_err_callback = err_callback;
      return this.saved_promise

    } else if (this.state == 'rejected') {
      return new MyPromise(() => {
        err_callback();
        this.reject();
      })
    } else {
      return new MyPromise(() => {

        ok_callback(this.value);
        
      });
  
    }
  }

  let megares = this.resolve.bind(this);
  let megarej = this.reject.bind(this);

  try { 
  fn(megares, megarej)
  } catch (catched_error) {
    this.reject(catched_error)
  }
}
  • Вопрос задан
  • 73 просмотра
Решения вопроса 1
Kozack
@Kozack Куратор тега JavaScript
Thinking about a11y
Если я правильно понял ваш вопрос и ваш код, то думаю нужно делать как-то так:
if (this.value instansOf MyPromise) {
    return this.value.then(ok_callback, err_callback)
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
от 1 600 до 4 200 $
Foodtronics Москва
от 180 000 до 220 000 ₽
SoftMediaLab Екатеринбург
До 180 000 ₽
29 нояб. 2020, в 01:43
15000 руб./за проект
29 нояб. 2020, в 01:16
500 руб./за проект
29 нояб. 2020, в 00:50
800 руб./за проект