Javascript async / await вопрос: невозможно выяснить, почему программа не возвращает никаких ошибок

#javascript #async-await #assert #assertion

#javascript #async-await #утверждать #утверждение

Вопрос:

Обратитесь к функции

 async function dq(isOk){
if(isOk) {return "OK";}
else {throw new Error("not OK");}
} 
  

Какое утверждение точно проверяет приведенный выше код:

  1. console.assert(ожидает dq (true), ‘OK’);
  2. console.assert(await(dq (true), ‘not OK’));
  3. console.assert(ожидает dq (true), ‘not OK’);
  4. console.assert(dq(true), ‘OK’);

для всех 4 вариантов я получаю undefined в консоли разработчика даже для варианта 2, где await() никогда не является функцией.

Комментарии:

1. попробуйте использовать его внутри асинхронной функции (async () => { console.assert((await dq(true))); })()

Ответ №1:

Если обещание выполняется нормально, то await promise возвращает результат. Но в случае отклонения он выдает ошибку, как если бы в этой строке был оператор throw .

 async function f() {
  await Promise.reject(new Error("Whoops!"));
}
  

В реальных ситуациях обещание может занять некоторое время, прежде чем оно будет отклонено. В этом случае будет задержка, прежде чем await выдаст ошибку.
Мы можем перехватить эту ошибку, используя try ..catch , так же, как и обычный throw:

 async function f() {
  try {
    let response = await fetch('http://no-such-url');
  } catch(err) {
    alert(err); // TypeError: failed to fetch
  }
}
f();
  

Если мы забудем добавить туда .catch , то получим необработанную ошибку promise (видимую в консоли). Мы можем перехватывать такие ошибки, используя глобальный обработчик событий необработанного отклонения.

Ссылка https://javascript.info/async-await .

Комментарии:

1. Привет, Анккит, спасибо за сообщение, я понял вашу точку зрения, но в приведенном выше асинхронном методе dq нет связанного с ним promise, поэтому в этом случае я проверял поведение. Я могу заверить, что 4-й вариант неверен, поскольку он будет срабатывать до асинхронной функции dq