Общая логика повторения обещания - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь выяснить, как создать универсальную функцию повтора, которая экспоненциально откатывает любое переданное ей обещание. Похоже, что все работает, за исключением нескольких вещей. Если функция разрешается с первой попытки, тогда я вижу свое значение разрешения, и она выходит из системы, как и ожидалось. Если он разрешается при любом последующем вызове, он не выходит из системы. Если он отклоняет, я получаю пару предупреждений об устаревании, которые я еще не изучал. Вот код ...

function retry(func, max, time) {
    console.log(max);
    return new Promise((resolve, reject) => {
        func()
            .then(r => resolve(r))
            .catch(err => {
                if (max === 0) {
                    reject(err);
                } else {
                    setTimeout(function(){
                        retry(func, --max, time * 2);
                    }, time);
                }
            });
    });
}

const promise = retry(function () {
    return new Promise((resolve, reject) => {
        const rand = Math.random();
        if (rand >= 0.8) {
            resolve('hey');
        } else {
            reject(new Error('oh noes'));
        }
    });
}, 5, 100);

promise.then(r => console.log(r)).catch(err => console.log(err));

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 10 мая 2018

Вот рабочий пример

/**
 * Function to retry
 */
function retry(func, max, time) {
  return new Promise((resolve, reject) => {
    apiFunction()
      .then(resolve)
      .catch(err => {
        if (max === 0) {
          return reject(err);
        } else {
          setTimeout(function() {
            retry(func, --max, time * 2)
              .then(resolve)
              .catch(reject);
          }, time);
        }
      });
  });
}

/**
 * Function to test out
 */
const apiFunction = () => new Promise((resolve, reject) => {
  const rand = Math.random();

  if (rand >= 0.8) {
    console.log('Works');
    
    resolve('hey');
  } else {
    console.log('fail');
    
    reject(new Error('oh noes'));
  }
});

retry(apiFunction, 5, 10)
  .then(() => console.log('all done ok'))
  .catch(() => console.log('all done error'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...