Я создал многообещающее Promise
которое я обертываю этой простой функцией, которую я создал, чтобы создать часы Promise
.
Функция ниже:
export const promiseTimeout = (
promise,
timeoutMs = 10000, //10 secs
message = 'Timeout reached, please try again',
) =>
Promise.race([
promise,
new Promise((resolve, reject) =>
setTimeout(() => {
reject(message);
}, timeoutMs),
),
]);
Способ, которым я планирую использовать его, заключается в том, что я передам долгое Promise
которое может потребовать другие непредсказуемые ресурсы, такие как интернет, файл, системные настройки и т.д.
Использование будет выглядеть следующим образом: const result = await promiseTimeout(longRunningFunction()).catch(err =>/* do something with the error, show toast or alert */);;
То, что в настоящее время происходит с этим, заключается в том, что всякий раз, когда тайм-аут достигнут, он будет вызывать catch, но операция longRunningFunction будет продолжаться.
Как я могу остановить операции с переданным аргументом Promise
в случае, если тайм-аут достигнут?
Как я могу остановить операции с переданным аргументом Promise в случае, если тайм-аут достигнут?
Эй, извините, у нас нет отмены асинхронных функций.
Обратите внимание, однако, что обещание - это ценность, а не действие, как только у вас есть обещание, что у нас не будет отмененных обещаний в JavaScript, невозможно отменить действие.
Единственное, что вы можете сделать, это сделать что-то вроде предложения об отмене и написать свой longRunningFunction
с помощью токена:
function longRunningFunction() {
const signal = { requested: false };
async function internal() {
// your regular code here
// whenever you can stop execution:
if(signal.requested) {
return; // and cancel internal operations
}
}
let res = internal();
res.signal = signal;
return res;
}
Затем напишите свою гонку как:
export const promiseTimeout = (
promise,
timeoutMs = 10000, //10 secs
message = 'Timeout reached, please try again',
) =>
Promise.race([
promise,
new Promise((resolve, reject) =>
setTimeout(() => {
reject(message);
if (promise.signal) promise.signal.requested = true;
}, timeoutMs),
),
]);
Error
имеют следы стека).