Подтвердить что ты не робот

Передача другого обещания обработчику обещаний

Я ожидал, что обработчик обещания зарегистрирует обещание p1 (а не значение "A"), так как console.log вызывается с p1 напрямую. Тем не менее, он каким-то образом записывает "A". Каким образом обещание p1 автоматически разрешено "A", не будучи вызванным на него? Например, console.log(p1) не выводит "A" напрямую, как ожидается. Что-то происходит за кулисами?

var p1 = new Promise(function(resolve, reject) {
  resolve("A");
});

var p2 = new Promise(function(resolve, reject) {
  resolve(p1);
});

p2.then(function(v) {
  console.log(v)
});
4b9b3361

Ответ 1

Разрешение обещания на другое обещание автоматически заставит его ждать результата другого обещания.

Это то, что делает обещания целыми (возвращая дополнительные обещания в then() обратные вызовы).

Ответ 2

Из документации MDN:

Promise.resolve (значение)

Возвращает объект Promise, который разрешен с заданным значением. Если значение является thenable (т.е. Имеет метод then), возвращенное обещание будет "следовать", что затем, принимая его возможное состояние; в противном случае возвращенное обещание будет выполнено со значением. Как правило, если вы не знаете, является ли значение обещанием или нет, Promise.resolve (значение) вместо этого и работает с возвращаемым значением в качестве обещания.

p1 можно использовать, поэтому за ним следует обещание возврата.