Как определить цепочку обещаний без использования метода then - PullRequest
0 голосов
/ 24 января 2019

Я уже искал похожие вопросы, но они связаны с JQuery или любой другой библиотекой.

Сначала я написал это:

const printIn1Sec = (value) => {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log(value);
      resolve();
    }, 1000)
  });
};

И использовал его следующим образом:

printIn1Sec(1)
.then(() => printIn1Sec(2))
.then(() => printIn1Sec(3));

Я думаю then очень важно, потому что оно позволяет нам выполнить что-то, как только обещание будет выполнено.

Но я искал что-то вроде этого:

printIn1Sec(1)
.printIn1Sec(2)
.printIn1Sec(3);

Я заметил, что мне нужен объект с доступом к этому printIn1Sec методу.Итак, я определил класс:

class Printer extends Promise {
  in1Sec(v) {
    return this.then(() => this.getPromise(v));
  }

  getPromise(value) {
    return new Printer(resolve => {
      setTimeout(() => {
        console.log(value);
        resolve();
      }, 1000)
    })
  }
}

И использовал его следующим образом:

Printer.resolve().in1Sec(1).in1Sec(2).in1Sec(3);

Мне пришлось resolve Обещание с самого начала, чтобы начать цепочку.Но это все еще беспокоит меня.

Как вы думаете, есть ли способ заставить его работать следующим образом?

printIn1Sec(1).printIn1Sec(2).printIn1Sec(3);

Я думал о новом классе или методе, который мог бы получить эти значения, сохранить их,и, наконец, начать решать цепочку.Но для этого потребуется в конце вызвать дополнительный метод, чтобы инициировать поток.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Если вы действительно хотите создать цепной интерфейс, как в вашем вопросе, это будет сделано:

const printIn1Sec = (function() {

  function setTimeoutPromise(timeout) {
    return new Promise(resolve => setTimeout(resolve, 1000));
  }

  function printIn1Sec(value, promise) {
    const newPromise = promise
      .then(() => setTimeoutPromise(1000))
      .then(() => console.log(value));

    return {
      printIn1Sec(value) {
        return printIn1Sec(value, newPromise);
      },
    };
  }

  return value => printIn1Sec(value, Promise.resolve());
}());

printIn1Sec(1)
  .printIn1Sec(2)
  .printIn1Sec(3);

Мы просто скрываем все создание и создание цепочки обещаний во внутренней функции.Я разделил код на более мелкие функции, чтобы он выглядел немного лучше.

0 голосов
/ 24 января 2019

Можно попробовать async и await

const printIn1Sec = (value) => {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log(value);
        resolve();
    }, 1000)
  });
};

async function fun(){
  await printIn1Sec(1);
  await printIn1Sec(2);
  await printIn1Sec(3);
}

fun();
...