Отклонить обещание javascript - PullRequest
0 голосов
/ 17 января 2020

Я хочу отказаться от обещания, которое я не сделал. То есть примеры, которые я прочитал, описывают что-то вроде этого:

const sample = new Promise((resolve, reject) => {
    setTimeout(() => {
        reject('fail promise');
    }, 1000);
});

, которые отклоняют sample через 1 с. В моем случае обещание, которое я хочу отклонить, приходит как внешний вызов API, тогда я не могу отклонить таким образом.

Другой прочитанный мной подход показывает, как обещание может быть упаковано с другим, использующим setTimeout, чтобы отклонить новое обещание. Примерно так:

const timeout = new Promise(function(resolve, reject) {
    setTimeout(resolve, 1000, 'one');
});

const sample = new Promise(function(resolve, reject) {
    setTimeout(resolve, 5000, 'two');
});

return Promise.race([sample, timeout]);

Эта сила 'отклонить' sample через 1 с, возвращая другое обещание. Это может быть использовано для установки таймаута, но на самом деле он не отклоняет sample, только возвращает другое обещание, и оригинал продолжает работать, пока не отклонит или не разрешит сам себя.

Я не могу найти, как я могу правильно отклонить обещание без библиотеки

Ответы [ 2 ]

1 голос
/ 17 января 2020

Зачем вам отказываться от их обещания? Что вас волнует, так это получение полезного результата для вашего кода, поэтому напишите код, который вместо этого даст вам этот результат.

Оберните вызов API в собственное обещание с отклонением тайм-аута на ваше обещание и сквозной resolve, если этот API дает результат до истечения времени ожидания:

const attempt = new Promise( (resolve, reject) => {
  // run the actual API _and_ your rejection timeout concurrently:
  let rejected = false;

  const id = setTimeout(() => {
    rejected = true;
    reject(new Error('timeout');
  }), 1000);

  actualApiCall(some, input, args, here)
    .then(result => {
      if (rejected) return; // <- if we rejected via timeout, we no longer care.
      clearTimeout(id);     // <- always remember to properly clean up
      resolve(result);
     })
    .catch(e => {
      if (rejected) return;
      clearTimeout(id);
      reject(e)
    });
});

attempt
  .then(result => doSomethingWith(result))
  .catch(e => console.log('rejected:', e));
0 голосов
/ 21 января 2020

Я не могу найти, как правильно отклонить обещание без библиотеки

Прежде всего, это не кажется мне хорошим подходом, даже если вы можете сделать далее

const apiPromise = externalApi();

Теперь apiPromise может находиться в состоянии resolved или rejected. В обоих случаях вы можете выдать ошибку типа

const rejectedPromise = apiPromise.then(
  (fulfilledValue) => { throw "error" },
  (rejetedValue) => { throw "error" }
);
rejectedPromise.catch(err => console.log(err)); //logs "error"

Подробнее о Promise.then ()

...