У меня есть простая функция timeout
, которая оборачивает асинхронную функцию тайм-аутом, чтобы гарантировать, что она выйдет из строя через заданный промежуток времени. Функция тайм-аута выглядит следующим образом:
export default async function<T = any>(
fn: Promise<T>,
ms: number,
identifier: string = ""
): Promise<T> {
let completed = false;
const timer = setTimeout(() => {
if (completed === false) {
const e = new Error(`Timed out after ${ms}ms [ ${identifier} ]`);
e.name = "TimeoutError";
throw e;
}
}, ms);
const results = await fn;
completed = true;
timer.unref();
return results;
}
Затем я использую эту функцию в этом простом фрагменте кода, чтобы запрос fetch (с использованием реализации node-fetch
) был преобразован в текстовый вывод:
let htmlContent: string;
try {
htmlContent = await timeout<string>(
response.text(),
3000,
`waiting for text conversion of network payload`
);
} catch (e) {
console.log(
chalk.grey(`- Network response couldn\'t be converted to text: ${e.message}`)
);
problemsCaching.push(business);
return business;
}
При выполнении этого кода на протяжении многих итераций большинство конечных точек URL-адресов предоставляют полезную нагрузку, которая может быть легко преобразована в текст, но иногда возникает одна ошибка, которая, кажется, просто вешает вызов fetch . В этом случае тайм-аут фактически срабатывает, но выброшенный TimeoutError
НЕ перехватывается блоком catch, а завершает работающую программу.
Я немного сбит с толку. Я часто использую async / await, но у меня все еще могут быть некоторые грубые края в моем понимании. Может кто-нибудь объяснить, как я могу эффективно зафиксировать эту ошибку и обработать ее?