Поймать отклонение обещания во вложенной функции

#node.js #promise

Вопрос:

У меня есть такой упрек: https://codesandbox.io/s/jolly-bogdan-k6ii4?file=/src/index.ts

код:

 const wait = (timeoutMs: number) => {
  let timeoutHandle: number | undefined;

  const promise = new Promise((_resolve, reject) => {
    timeoutHandle = setTimeout(() => {
      reject(`wait timed out after ${timeoutMs} ms`);
    }, timeoutMs);
  });

  return {
    promise,
    cancel: (): void => clearTimeout(timeoutHandle)
  };
};

const waitBy = (timeoutMs: number) => {
  const res = wait(timeoutMs);
  return res;
};

const main = async () => {
  try {
    const { promise, cancel } = waitBy(3000);
  } catch (error) {
    console.log("failed on timeout");
  }
  // try {
  //   await promise;
  // } catch (error) {
  //   console.log("timed out");
  // }
};

main();
 

Когда это будет запущено в Node.js, reject произойдет через 3 секунды и приведет ко взрыву всего процесса с «Ошибкой необработанного запроса» — где можно catch найти эту ошибку, чтобы избежать ошибки необработанного запроса, но разрешить ей распространяться catch внутри main функции?

Ответ №1:

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

 const main = async () => {
  try {
    const { promise, cancel } = waitBy(3000);
    await promise // new code
  } catch (error) {
    console.log("failed on timeout");
  }
  // try {
  //   await promise;
  // } catch (error) {
  //   console.log("timed out");
  // }
};