@r_ramil

Объясните пожалуйста как понять такое поведение promise?

const promise = new Promise((resolve, reject) => {
	resolve(console.log('start'));
});

promise
	.then(x => console.log('x'))
	.then(y => console.log('y'));

promise.then(z => console.log('z'));


Консоль:

start
x
z
y


При этом, если в then выводить console.log без стрелочной функции, то порядок вывода будет: start, x, y, z
  • Вопрос задан
  • 111 просмотров
Решения вопроса 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
"Z" прикрепляется же к самому первому "promise". На том же «уровне», что и "X"
Ответ написан
Seasle
@Seasle Куратор тега JavaScript
Вывод в консоль не в том порядке, который идёт по коду сверху вниз вызван тем, что в обещаниях мы можем выполнять некоторые долгие операции (например, запросы в бэкенд). В тот момент, когда происходит привязка then, catch и finally интерпретатор не будет ждать их выполнения и пойдет дальше. В итоге после "обхода" кода есть два "места", в которые вернется результат обещания. В первом promise, во время выполнения then мы не знаем, сколько времени потребуется для его выполнения, поэтому интерпретатор идет дальше, к следующему обещанию (в данном случае - "привязке"). Если хотите сделать так, чтобы обещания выполнялись именно в том порядке, который описан в коде, то надо писать как-то так:
(async () => {
  const promise = new Promise((resolve, reject) => {
    resolve(console.log('start'));
  });

  await promise
    .then(x => console.log('x'))
    .then(y => console.log('y'));

  await promise.then(z => console.log('z'));
})();

или так:
const start = async () => {
  const promise = new Promise((resolve, reject) => {
    resolve(console.log('start'));
  });

  await promise
    .then(x => console.log('x'))
    .then(y => console.log('y'));

  await promise.then(z => console.log('z'));
};

start();

или так (если в Вашей среде работает top level await):
const promise = new Promise((resolve, reject) => {
  resolve(console.log('start'));
});

await promise
  .then(x => console.log('x'))
  .then(y => console.log('y'));

await promise.then(z => console.log('z'));
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Alexandroppolus
@Alexandroppolus
кодир
При этом, если в then выводить console.log без стрелочной функции, то порядок вывода будет: start, x, y, z


Потому что тогда эти console.log будут вызваны синхронно, в том порядке, в котором они встречаются в коде. А сейчас синхронно только создаются те функции, которые вызывают console.log.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы