nepster-web
@nepster-web

Как реализовать абстракцию над последовательной цепочкой функций?

Задача:
const cell = new MyClass();

cell.then(() => {
  console.log(1); // Выполниться через секунду
});
cell.then(() => {
  console.log(2); // Выполниться через секунду после предыдущей
});
cell.then(() => {
  console.log(3); // Выполниться через секунду после предыдущей
});


Попытка реализации:
class MyCLass {
  constructor() {
    this.promise = new Promise(function(resolve, reject) {
        resolve();
      });
  }
  
   then(callback) {
      this.promise.then(new Promise(function(resolve, reject) {
         setTimeout(() => {
           callback();
           resolve();
         }, 1000);
       }));
       return this;
  }
};


Результат такой, что через секунд 1, 2, 3 возвращаются сразу. Что упустил?
  • Вопрос задан
  • 211 просмотров
Решения вопроса 3
Kozack
@Kozack Куратор тега JavaScript
Thinking about a11y
Примерно как-то так:
class MyCLass {
  static wait(t = 1000) {
    return new Promise(r => setTimeout(r, t))
  }
  
  constructor() {
    this._promise = Promise.resolve()
  }

  then(callback) {
    this._promise = this._promise.then(MyCLass.wait).then(callback)
    return this;
  }
}
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
Дело в том, что новые промисы создаются не «потом», а сразу, при добавлении очередной задачи. Так они не становятся в очередь друг за другом.

Можно добавить метод, который будет создавать новый промис только, когда его время придёт:
class Q {
  constructor() {
    this.promise = Promise.resolve();
  }

  makePromise(cb) {
    return new Promise(res => setTimeout(
      () => {
        cb();
        res();
      },
      1e3
    ));
  }

  enqueue(cb) {
    this.promise = this.promise
      .then(() => this.makePromise(cb));
    return this;
  }
}


const cell = new Q();
cell.enqueue(() => console.log(1));
cell.enqueue(() => console.log(2));
cell.enqueue(() => console.log(3));
Ответ написан
Комментировать
@Che603000
c 2011 javascript
this.promise.then требует функции как параметр, Вы передали объект
this.promise.then(()=>new Promise(function(resolve, reject) {
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы