Распространение отказа от внешнего обещания к внутреннему обещанию

1

Я создал многообещающее 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 в случае, если тайм-аут достигнут?

  • 0
    Эй, в качестве случайного предложения обычно предпочтительнее отклонить объект Error, чтобы легче было определить, откуда происходит отклонение (поскольку Error имеют следы стека).
  • 0
    спасибо @BenjaminGruenbaum БенджаминGruenbaum
Теги:
promise
es6-promise

1 ответ

1
Лучший ответ

Как я могу остановить операции с переданным аргументом 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),
    ),
  ]);
  • 0
    Я думаю, что мне нравится эта идея вместо того, чтобы использовать синюю птицу, которая мне не нужна прямо сейчас.
  • 0
    @JojoNarte как ядро bluebird с 2013 года - я поддерживаю это сообщение;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню