Завершение promise по таймауту

Иногда требуется принудительно завершить промис по истечении какого-то времени, однако в стандартном API нет такой опции.

Написал небольшую обертку для таких случаев:

const promiseWithTimeout = (params = {}) => {
  const {
    promise = () => Promise.resolve(),
    timeout = 2000,
  } = params;

  return new Promise((resolve, reject) => {
    const rejectByTimeout = setTimeout(reject, timeout);

    promise()
      .then((response) => {
        clearTimeout(rejectByTimeout);
        resolve(response);
      })
      .catch((reason) => {
        clearTimeout(rejectByTimeout);
        reject(reason);
      });
  });
};

Пример использования:

promiseWithTimeout({
  promise: () => Api.getEntities(),
  timeout: 4000,
})
  .then((entities) => {
    // do something with entities ...
  })
  .catch((error) => {
    // handle error
  });

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.