Вы можете добавить время ожидания ошибки к любому обещанию, как это:
// utility function that creates a promise that rejects after a certain time
function timeoutPromise(t, errMsg = "timeout") {
// create possible error object here to get appropriate stack trace
let e = new Error(errMsg);
e.timeout = true;
return new Promise((resolve, reject) => {
setTimeout(reject, t, e);
});
}
// wrap a promise with a timeout, pass promise, time in ms and
// optional timeout error message
function timeout(p, t, errMsg = "timeout") {
return Promise.race([p, timeoutPromise(t, errMsg)]);
}
. Вы можете использовать это с вашим fs.copy()
следующим образом:
const writeResult = await timeout(fs.copy(...), 5000);
Итак, тогда если fs.copy()
занимает более 5 секунд, ожидаемое вами обещание будет отклонено, и вы можете перехватить его в обработчике catch
и действовать соответственно. Вы увидите, что у объекта ошибки есть свойство .timeout
.
Способ, которым это работает, заключается в том, что функция timeout()
создает гонку между обещанием, которое вы передали, и другим обещанием, которое будет отклонено после Ваш тайм-аут истекает. Первый завершитель контролирует вывод Promise.race()
и, следовательно, контролирует то, что вы используете await
. Если тайм-аут выигрывает, то обещание будет отклонено.