Обещание JavaScript: проблема с setTimeout внутри гонки обещаний - PullRequest
0 голосов
/ 10 ноября 2018

следующий код выводит (1), затем (3) что неправильно .. почему?

следующий код предназначен для ожидания 3 секунд и распечатать (3), затем подождать еще 1 секунду, затем распечатать (1) поэтому правильный порядок должен быть (3), затем (1)

Я думаю, проблема в том, что wait () возвращает новое обещание, но как я могу исправить эту проблему? примечание: все функции должны возвращать 'this' для создания цепочки

class test extends Promise {
  constructor(fn) {
    super(fn)
    return this
  }

  wait(seconds) {
    return new test(resolve =>
      setTimeout(function() {
        resolve(seconds)
      }, seconds * 1000)
    )
  }

  done(fn) {
    return super.then(fn)
  }
}

p = new test(r => r())
p.wait(3) //(2) must be before (1)
  .done(x => console.log(x))
  .wait(1)
  .done(x => console.log(x))

1 Ответ

0 голосов
/ 10 ноября 2018

Вам нужно wait, чтобы вызвать .then текущего test объекта (то есть this) и вернуть построенную цепочку Promise:

class test extends Promise {
  constructor(fn) {
    super(fn)
    return this
  }

  wait(seconds) {
    return this.then(() => new test(resolve => {
      setTimeout(function() {
        resolve(seconds)
      }, seconds * 1000);
    }))
  }

  done(fn) {
    return super.then(fn)
  }
}

console.log('start');
p = new test(r => r())
p.wait(3) //(2) must be before (1)
  .done(x => console.log(x))
  .wait(1)
  .done(x => console.log(x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...