Почему передача обещания javascript в `then` приводит к странному поведению?

В спецификации es6 указано, что передача non-callable в promise then установит обработчик обещания «при выполнении» в «идентификацию». В другом разделе спецификации указано, что "идентификация " - это функция, которая оценивает заданное значение. В соответствии с тем, что говорит спецификация, я предполагаю, что этот код:

Promise.resolve("foo").then(Promise.resolve("bar")).then(v => console.log(v))

быть равным этому коду:

Promise.resolve("foo").then(v => Promise.resolve("bar")).then(v => console.log(v))

Но если оба примера кода выполняются в последней версии Chrome или Firefox, первый выводит «foo», а второй выводит «bar». Где я неправильно понял спецификацию?


person grigoryvp    schedule 23.01.2016    source источник
comment
Вы путаете передачу обещания в then (ваш первый пример) и передачу функции, которая возвращает обещание (ваш второй пример). Первый ничего не делает согласно спецификации, так как then игнорирует все нефункциональные параметры.   -  person    schedule 23.01.2016


Ответы (1)


Согласно этому разделу ECMAScript-6,

Если [[Handler]] имеет значение "Identity", это эквивалентно функции, которая просто возвращает свой первый аргумент.

Таким образом, вы можете думать о Identity как о следующей функции стрелки

(first) => first

Итак, ваша цепочка обещаний

Promise.resolve("foo").then(Promise.resolve("bar")).then(v => console.log(v))

эффективно становится

Promise.resolve("foo").then((first) => first).then(v => console.log(v))

Вот почему вы получаете foo.

person thefourtheye    schedule 23.01.2016