Node JS Поведение Обещаний - PullRequest
       0

Node JS Поведение Обещаний

0 голосов
/ 02 апреля 2020

Я работаю с обещаниями, и я не могу понять, как он ведет себя в node js.

function m1(txt) {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log(txt + ' - done');
      resolve()
    }, 1000);
  });
}

var foo = m1('a');

foo.then(() =>  m1('b').then(() => console.log('do something immediately after b')));

foo.then(() => m1('c'));

Ожидаемый вывод, а также в консоли chrome.

a - done
b - done
do something immediately after b
c - done

Но я получаю следующий вывод в Node JS.

a - done
b - done
c - done
do something immediately after b

Пожалуйста, помогите, я не могу понять, почему это происходит и что я делаю, чтобы получить ожидаемый результат.

Ответы [ 3 ]

1 голос
/ 07 апреля 2020

Здравствуйте, пожалуйста, проверьте версию узла. До v11 вы получите:

a - done
b - done
c - done
do something immediately after b

с версией v11 и выше:

a - done
b - done
do something immediately after b
c - done

, так как были внесены изменения, чтобы он следовал поведению браузера. Вот полезная статья об этом https://blog.insiderattack.net/new-changes-to-timers-and-microtasks-from-node-v11-0-0-and-above-68d112743eb3

1 голос
/ 07 апреля 2020

Каждый раз, когда обещание разрешается, все (первый уровень) .then(), прикрепленные к нему, планируется выполнить на следующем тике события l oop. Итак, в вашем случае:

foo.then(() => m1('b').then(() => console.log('do something immediately after b')));
foo.then(() => m1('c'));

После разрешения foo мы получаем первый журнал:

a - done

Обратные вызовы foo будут запланированы для выполнения в следующем тик события l oop:

| Next tick |
|:---------:|
|  then(b)  |
|  then(c)  |

Итак, выполнив тик, мы получаем следующий журнал:

a - done
b - done
c - done

Помните, then(b) имел обратный вызов журнала. Поэтому во время выполнения обратный вызов добавляется к следующему событию l oop tick. Таким образом, следующий тик будет:

| Next tick |
|:---------:|
| then(log) |

Итак, выполнив второй тик, мы получим ваш окончательный журнал:

a - done
b - done
c - done
do something immediately after b
0 голосов
/ 10 апреля 2020

Чтобы получить ожидаемый результат, я сделал следующие изменения

function m1(txt) {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log(txt + ' - done');
      resolve()
    }, 1000);
  });
}

var foo = m1('a');

foo = foo.then(() =>  m1('b').then(() => console.log('do something immediately after b')));

foo = foo.then(() => m1('c'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...