Распространение отказа от внешнего обещания к внутреннему обещанию - PullRequest
0 голосов
/ 13 октября 2018

Я создал долгоиграющую 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 */);;

В настоящее время происходит следующее: каждый раз, когда истекает тайм-аут, вызывается перехват, но операция longRunningFunction все еще будет продолжаться.

Как я могу остановить операции над переданным аргументом Promise, если истечет время ожидания?

1 Ответ

0 голосов
/ 14 октября 2018

Как я могу остановить операции над переданным обещанием в аргументе, если когда-либо достигнут тайм-аут?

Эй, извините, у нас пока нет отмены асинхронных функций.

Обратите внимание, что обещание является значением, а не действием , если у вас есть обещание, если у нас не будет отменяемых обещаний в 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),
    ),
  ]);
...