#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");
// }
};