Проверено на https://repl.it/repls/UntrueLankySorting
Он показывает вам результат вызова catch
здесь:
testFunc().then(token => {}).catch(x => {});
Вас не волнует это обещание, просто окружающая среда показывает его вам. Это действительно ожидаемое обещание на момент возвращения catch
, но оно будет урегулировано позже.
Это всего лишь один из аспектов среды, в которой вы его выполняли. Сам код прекрасно работает, за исключением проблемы, о которой я говорил в комментариях (что getSomething
не возвращает обещание, поэтому нет необходимости await
его ).
В комментарии вы спросили:
Вернется ли catch
в этом случае? Так как никакая ошибка не выдана, это должно разрешиться в then
правильно?
then
и catch
всегда возвращают обещание. Обещание, которое они возвращают, разрешается или отклоняется в зависимости от того, что происходит с обещанием, которое вы назвали then
/ catch
, и, если их обработчик запускается, что происходит в обработчике и что он возвращает.
В этом примере вот что делает этот код:
- Вызывает
testFunc
и получает обещание, которое оно возвращает (функции async
всегда возвращают обещания). Назовите это обещание А.
- Звонит
then
по Обещанию A. then
возвращает новое обещание (Обещание B).
- Звонит
catch
по Обещанию B. catch
возвращает новое обещание (Обещание C).
repl.it
показывает вам Обещание C, которое в данный момент ожидает рассмотрения. ¹
- Promise A выполняет², что вызывает обработчик
then
. Обработчик then
(эффективно) возвращает undefined
.
- Это выполняет Обещание B со значением
undefined
, которое выполняет Обещание C (без вызова обработчика catch
, потому что обещание было выполнено, а не отклонено).
for Было бы допустимо, чтобы реализация показывала выполненное состояние там вместо в этом примере , но для всех намерений и целей лучше всего рассматривать обещание как ожидающее в тот момент. Поскольку код никогда не может напрямую наблюдать за состоянием обещания, ваш код не может определить разницу.
² Точно так же было бы допустимо, если бы оно уже было выполнено до того, как then
было вызвано для него, но точно так же вы никогда не сможете увидеть это непосредственно в коде, поэтому ...