Странное поведение с обещаниями - PullRequest
2 голосов
/ 26 апреля 2019

Я делаю несколько тестов с обещаниями и написал код, который ведет себя не совсем так, как я ожидал:

function function1() {
  return new Promise((resolve, reject) => {
    let i = 5000000000;
    while (i > 0) {
      i--;
    }
    resolve("print function1!!!");
  });
}

function function2() {
  console.log("print function2!!!");
}

function function3() {
  function1().then(data => console.log(data));
  function2();
}

function3();

выполнение этого кода ожидает завершения цикла в функции1и затем напечатайте:

print function2 !!!

print function1 !!!

Я ожидал, что код напечатает «print function2!»!!»затем дождитесь завершения цикла и напечатайте «print function1 !!!».

Почему цикл внутри обещания блокирует выполнение кода?

Ответы [ 2 ]

4 голосов
/ 26 апреля 2019

Почему цикл внутри обещания блокирует выполнение кода?

Это модель исполнения JavaScript (в браузерах и узлах). Ваш код никогда не выгружается, код всегда выполняется от начала до конца и может только «зарегистрировать» код для платформы, которая будет запущена позднее.

Конструктор обещаний работает синхронно. Обещания не привносят многопоточность в ваш код, и они только откладывают выполнение кода в обратных вызовах then до «после всего синхронного кода», но до всего кода платформы.

Обещания - это всего лишь дескриптор будущего значения - они не заставляют ваш код выполняться в другом потоке. Если вам нужно запустить код в другом потоке, вам нужно использовать worker_threads (в Node.js) или веб-рабочие в браузерах.

1 голос
/ 26 апреля 2019

Проблема в том, что ваше обещание не содержит асинхронного кода.Если вы не хотите ждать выполнения кода внутри обещания function1, вам нужно написать его, например, в setTimeout.

function function1() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      let i = 5000000000;
      while (i > 0) {
        i--;
      }
      resolve("print function1!!!");
    }, 0);
  });
}

function function2() {
  console.log("print function2!!!");
}

function function3() {
  function1().then(data => console.log(data));
  function2();
}

function3();
...