Как await и Promise.resolve() проверяют, является ли их аргумент допустимым?

Я хотел бы иметь возможность рассуждать о том, что будет делать await, когда он вызывается для различных значений.

Документация MDN для await описывает процедуру принятия решения, один из шагов которой заключается в том, чтобы решить, является ли объект thenable (после того, как он определил, что это не Native Promise):

Выражение разрешается так же, как и Promise.resolve(): оно всегда преобразуется в собственный Promise, а затем ожидается. Если выражение представляет собой:

  • Родное обещание [...]
  • Затем объект (включая неродные промисы, полифилл, прокси, дочерний класс и т. д.): [...]
  • [...]

(И связанный документ для Promise.resolve() также говорит по существу то же самое — в частности, он ссылается на тот же раздел Thenable object в документации Promise).

Итак, переходя по этой ссылке на объект Thenable, мы все еще ищем точное определение Thenable object, как оно используется в процедуре принятия решения (т. е. как именно await и Promise.resolve() проверяют его в этой процедуре принятия решения):

thenable реализует метод .then(), который вызывается с двумя обратными вызовами: один, когда обещание выполнено, другой, когда оно отклонено.

Это самое близкое к ответу на этой странице, но это не ответ.

(Например, считается ли вещь, которая, как известно, не является Native-Promise, управляемой, если попытка получить ее свойство then не выдает выдачу? Или она не выдает и не возвращает не неопределенное значение? Или, не выбрасывает и не возвращает что-то, чья typeof равна function? Или не выбрасывает и возвращает что-то такое, что вызов с двумя обратными вызовами не выдает и т. д.; есть много возможностей, и я уверен, что это правильно? где-то в спецификации.)

Мой конкретный вопрос: как именно await и Promise.resolve() решают, рассматривать ли свой аргумент (как только решено, что это не-Native-Promise) как Thenable object для целей процедуры принятия решения, указанной выше?

(Примечание: этот вопрос касается оператора ES8 await и обещаний ES6; речь идет не о bluebird, обещаниях/A+ или любых других реализациях/спецификациях обещаний, поэтому предыдущие вопросы/ответы по ним неприменимы.)

Это..?
Teemu 11.07.2024 09:50

Посмотрите здесь или там

Bergi 11.07.2024 10:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Считается ли вещь допустимой тогда и только тогда, когда попытка получить ее свойство then не выбрасывает и не возвращает что-то, чье typeof есть function?

Да, очень то. Вы можете найти это в §27.2.1.3.2 Функции разрешения обещаний , процедуре разрешения обещания со значением, которое используется new Promise, Promise.resolve и (в расширении) await. Это по-прежнему соответствует процедуре Promises/A+ и ее определению «тогда возможно».

Я понимаю. С тем нюансом, что (если я правильно читаю), если попытка получить свойство then выдает ошибку, то это не делает его неприемлемым для целей этой процедуры принятия решения; скорее, это превращается в «отклонено». Похоже, спецификация очень нужна, чтобы ответить на этот вопрос; это описание страницы MDN служит приблизительным описанием поведения, но оно даже близко не помогает ответить на него в конкретных случаях.

Don Hatch 11.07.2024 13:23

Ну, если доступ к then выдает ошибку, это не метод… И вообще, любые исключения во время процедуры разрешения превращаются в отклонения, ничем не отличается для обратного вызова исполнителя конструктора, метода доступа .then или фактического вызова метода.

Bergi 11.07.2024 13:30

Это звучит как хороший способ подумать об этом и запомнить его, хотя я не вижу, чтобы этот общий принцип был указан где-либо на этих трех страницах MDN или в разделе спецификаций, на который вы указали. Это где-то конкретно в спецификации или документации? Или нужно просто сделать вывод, прочитав все конкретные пункты и/или зная обоснование этих пунктов спецификации?

Don Hatch 11.07.2024 13:45

Я бы сказал, что это просто общее обоснование того, что игнорировать исключения — это плохо, а превращать их в отклонения — разумный поступок.

Bergi 11.07.2024 13:51

Другие вопросы по теме