Вывод в консоль не в том порядке, который идёт по коду сверху вниз вызван тем, что в обещаниях мы можем выполнять некоторые долгие операции (например, запросы в бэкенд). В тот момент, когда происходит привязка
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'));