Положение ваших точек останова имеет значение, и поведение будет таким же в отладчике Node.js и отладчике браузера.
В дальнейшем я использую метки типа <b1>
для определения позиций точек останова.
1. const p1 = new Promise((resolve) => <b1> resolve('result 1'))
2. <b2>
3. const p2 = p1.then(() => <b3> 'result 2')
4. <b4>
При <b1>
, p1
не будет объявлено, поскольку функция исполнителя выполняется синхронно, а процесс объявления переменной еще не завершен.
При <b2>
, p1
будет выполненным обещанием (Promise {<fulfilled>: "result 1"}
), разрешенным со значением 'result 1'
, так как в функции-исполнителе было вызвано разрешение.
Следующая точка останова, которая будет достигнута, будет <b4>
. Примечание: не <b3>
.
При <b4>
, p2
будет ожидающим обещанием (Promise {<pending>}
) , потому что обещание было настроено с .then
, который еще не имел возможности запускаться. .then
обратные вызовы выполняются на асинхронных микрозадачах, чтобы дать программисту возможность настроить цепочку обещаний перед ее выполнением. В конце концов, обещания предназначены для использования с асинхронным поведением.
В следующей доступной микрозадаче будет выполняться вызов <b3>
при выполнении обратного вызова .then
. На <b3>
значения p1
и p2
остаются без изменений. p1
был выполнен ранее и не изменится. Состояние p2
не изменилось, поскольку .then
, с которым он был настроен, еще не завершил работу.
Чтобы наблюдать за p2
в его выполненном состоянии, необходимо добавить точку останова к расширению цепочки обещаний.
let p1 = new Promise((resolve) => resolve('result 1'))
const p2 = p1.then(() => 'result 2')
p2.then(() => {
// here `p2` === `Promise {<resolved>: "result 2"}`
console.log(p2)
})