Печатайте номера по порядку, задержка появления элемента зависит от порядкового номера элемента - PullRequest
0 голосов
/ 10 ноября 2019

Я хочу напечатать последовательность чисел;он всегда должен начинаться с 1 и показываться с задержкой в ​​1 с (1000 мс). Следующее число в списке, 2, должно быть напечатано с задержкой в ​​2 секунды, после предыдущего, т. Е. 1 было напечатано и так далее, пока не будет достигнут заданный предел. Это было сделано последовательно.

1 должен печатать за время 1 секунда

2 должен печатать за время 3 секунды

3 должен печатать за время 6 секунд и так далее ..

Я имел в виду два подхода: либо использование Promises, либо использование функции генератора / async-await

Мой вопрос касается первого подхода, т. Е. Использования Promise.

а. При использовании setTimeout я не получаю правильный заказ

b. Принимая во внимание, что использование функции блокировки / задержки дает мне правильный результат.

a. При использовании setTimeout я не получаю правильный порядок

Причины, которые противоречат этому поведению: каждая задача, переданная функциональности Timer браузера / Node.js, ожидает завершения таймаута, один разготово, выдвигает задачу в стек вызовов.

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

Может кто-нибудь сообщить мнес правильной интуицией или помогите мне с правильным пониманием.

(function printAsyncInOrder(limit) {
  let [, ...list] = [...Array(limit + 1).keys()];

  list.reduce(chainedSequence, Promise.resolve());

  function chainedSequence(chain, currentOrder, index) {
    return chain.then(() => {
      let i = index;
      let current = currentOrder;
      //  setTimeout(() => console.log(`Hi ${index} ${new Date()}`), i * 1000)

      blocker(current * 1000);
    });
  }

  function blocker(time) {
    let timeNow = new Date();
    while (new Date() - timeNow < time) {}
    console.log(`hi ${time} ${new Date()}`);
  }
})(10);

Использование setTimeout:

Hi 2 Sun Nov 10 2019 11:37:44
Hi 3 Sun Nov 10 2019 11:37:45
Hi 4 Sun Nov 10 2019 11:37:46
Hi 5 Sun Nov 10 2019 11:37:47
Hi 6 Sun Nov 10 2019 11:37:48
Hi 7 Sun Nov 10 2019 11:37:49
Hi 8 Sun Nov 10 2019 11:37:50
Hi 9 Sun Nov 10 2019 11:37:51
Hi 10 Sun Nov 10 2019 11:37:52

с использованием функции блокировки / задержки

hi 2000 Sun Nov 10 2019 11:38:29
hi 3000 Sun Nov 10 2019 11:38:32
hi 4000 Sun Nov 10 2019 11:38:36
hi 5000 Sun Nov 10 2019 11:38:41
hi 6000 Sun Nov 10 2019 11:38:47
hi 7000 Sun Nov 10 2019 11:38:54
hi 8000 Sun Nov 10 2019 11:39:02
hi 9000 Sun Nov 10 2019 11:39:11
hi 10000 Sun Nov 10 2019 11:39:21

1 Ответ

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

вам нужно будет вернуть Обещание в chain.then(() => {, которое разрешается после истечения времени ожидания

, как это

(function printAsyncInOrder(limit) {
  let [, ...list] = [...Array(limit + 1).keys()];

  list.reduce(chainedSequence, Promise.resolve());

  function chainedSequence(chain, currentOrder, index) {
    return chain.then(() => {
      let current = currentOrder;
      return new Promise(resolve => setTimeout(() => {
        console.log(`Hi ${index} ${new Date()}`);
        resolve();
      }, 1000 * index));
    });
  }
})(10);
...