несколько запросов с таймаутом и попытками
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})