несколько запросов с таймаутом и попытками

by Ksenia Polyakova

JavaScript

/* function foo (url, {timeout, tries}) {
  function tryToFetch(timesLeft) {
    return new Promise((resolve, reject) => {
    
      setTimeout(() => {
      console.log('fail');
        reject(new Error('Timedout'));
      }, timeout);
    
      return fetch(url).then(res => {
        if (res.status === 200) {
          resolve(res.body);
        } else {
          reject(new Error('Unexpected status code'));
        }
      }).catch(e => console.log(e) || reject(e))
    
    })
    .catch(e => {
      console.log('err');
      timesLeft --;
      if (timesLeft > 0) {
        return tryToFetch(timesLeft);
      } else {
        console.log('the end', e)
        return e;
      }
    })
  };
  
  return tryToFetch(tries);
} */

function getUrl(url, {retries, timeout}) {
    function worker(remainingRetries) {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                reject(new Error('Timedout'));
            }, timeout);

            fetch(url).then((response) => {
                if (response.status === 200) {
                    resolve(response.body);
                } else {
                    reject(new Error('Unexpected status code'));
                }
            }).catch(reject);
        }).catch((err) => {
            remainingRetries--;
            if (remainingRetries > 0) {
                return worker(remainingRetries);
            } else {
                throw err;
            }
        });
    }

    return worker(retries);
}

getUrl('https://api.github.com/users/xiaotian/repos', {tries: 5, timeout: 1000})