Почему я вижу "Promise {<pending>}" из этого кода на repl.it? - PullRequest
3 голосов
/ 21 марта 2019

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

async function testFunc() {
  var test = await getSomething();
  //test.resolve();
  console.log("hello" + test);
  return "";
}
testFunc().then(token => {}).catch(x => {});

function getSomething() {
    return "ex";
}

В большинстве ответов предлагается использовать .then () для разрешения обещания, но я это сделал и все еще получаю обещание в ожидании.Что в этом плохого?

Проверено это на https://repl.it/repls/UntrueLankySorting

Это показывает мне это:

helloex
=> Promise { <pending> }

1 Ответ

5 голосов
/ 21 марта 2019

Проверено на https://repl.it/repls/UntrueLankySorting

Он показывает вам результат вызова catch здесь:

testFunc().then(token => {}).catch(x => {});

Вас не волнует это обещание, просто окружающая среда показывает его вам. Это действительно ожидаемое обещание на момент возвращения catch, но оно будет урегулировано позже.

Это всего лишь один из аспектов среды, в которой вы его выполняли. Сам код прекрасно работает, за исключением проблемы, о которой я говорил в комментариях (что getSomething не возвращает обещание, поэтому нет необходимости await его ).

В комментарии вы спросили:

Вернется ли catch в этом случае? Так как никакая ошибка не выдана, это должно разрешиться в then правильно?

then и catch всегда возвращают обещание. Обещание, которое они возвращают, разрешается или отклоняется в зависимости от того, что происходит с обещанием, которое вы назвали then / catch, и, если их обработчик запускается, что происходит в обработчике и что он возвращает.

В этом примере вот что делает этот код:

  1. Вызывает testFunc и получает обещание, которое оно возвращает (функции async всегда возвращают обещания). Назовите это обещание А.
  2. Звонит then по Обещанию A. then возвращает новое обещание (Обещание B).
  3. Звонит catch по Обещанию B. catch возвращает новое обещание (Обещание C).
  4. repl.it показывает вам Обещание C, которое в данный момент ожидает рассмотрения. ¹
  5. Promise A выполняет², что вызывает обработчик then. Обработчик then (эффективно) возвращает undefined.
  6. Это выполняет Обещание B со значением undefined, которое выполняет Обещание C (без вызова обработчика catch, потому что обещание было выполнено, а не отклонено).

for Было бы допустимо, чтобы реализация показывала выполненное состояние там вместо в этом примере , но для всех намерений и целей лучше всего рассматривать обещание как ожидающее в тот момент. Поскольку код никогда не может напрямую наблюдать за состоянием обещания, ваш код не может определить разницу.

² Точно так же было бы допустимо, если бы оно уже было выполнено до того, как then было вызвано для него, но точно так же вы никогда не сможете увидеть это непосредственно в коде, поэтому ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...