JavaScript Обещания с разрешением setTimeout в последовательности - PullRequest
1 голос
/ 16 марта 2020

Я хочу напечатать 3 сообщения в определенной последовательности, где каждое сообщение отображается через n секунд после отображения предыдущего сообщения. Требуя реализовать это с помощью JavaScript и используя Promises, я написал функцию с именем printLater, которая возвращает Promise с использованием setTimeout для реализации механизма блокировки / ожидания следующим образом:

let printLater = (message, delay) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(message);
            resolve();
        }, delay);        
    })
}

Затем, Я попытался использовать 3 обещания для последовательной печати сообщений и с задержками.

printLater('first message, after 2 seconds from start of program', 2_000)
    .then(printLater('second message, after 5 seconds after first message is displayed', 5_000))
    .then(printLater('third message, after 1 second after second message is displayed', 1_000));

Требуется вывод:

first message, after 2 seconds from start of program
second message, after 5 seconds after first message is displayed
third message, after 1 second after second message is displayed

Но фактический вывод был:

third message, after 1 second after second message is displayed
first message, after 2 seconds from start of program
second message, after 5 seconds after first message is displayed

Я пытаюсь понять, почему последовательность не в порядке, учитывая, что я разрешаю в функции, указанной для setTimeout.

Ответы [ 2 ]

2 голосов
/ 16 марта 2020

Вы можете создать другую функцию, которая будет возвращать оболочку для printLater():

const printLaterCallback = (message, delay) =>
    () => printLater(message, delay);

Затем вы можете использовать это в вызовах .then():

printLater('first message, after 2 seconds from start of program', 2_000)
    .then(printLaterCallback('second message, after 5 seconds after first message is displayed', 5_000))
    .then(printLaterCallback('third message, after 1 second after second message is displayed', 1_000));
0 голосов
/ 16 марта 2020

Привет, цепочка Promise неверна

const printLater = (message, delay) => new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log(`*** ${message} ***`);
    resolve();
  }, delay);
});

printLater('first message, after 2 seconds from start of program', 2000)
  .then((data) => {
    printLater('second message, after 5 seconds after first message is displayed', 5000)
      .then((data) => {
        printLater('third message, after 1 second after second message is displayed', 1000).then((data) => {});
      });
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...