参考链接:Promise 异步请求串行&并行执行实现
// 给定一个数组urls,里面保存着一组请求的url
// 通过调用一个getResponse(url)方法
// 发送异步请求。该方法返回值为一个promise。
const urls = ['url1', 'url2', 'url3', 'url4'];
const getResponse = (url) => {
return new Promise((resolve, reject) => {
console.log('参数为:', url)
setTimeout(() => {
console.log('异步请求的结果来自:' + url);
resolve();
}, 1000)
})
}
// 并行
urls.forEach(val => {
getResponse(val);
});
// 串行
(async () => {
for (const url of urls) {
await getResponse(url);
}
})()
urls.reduce(async (pre, cur) => {
await pre;
await getResponse(cur);
}, Promise.resolve());
urls.reduce((pre, cur) => {
return pre.then(() => {
return Promise.resolve(getResponse(cur));
});
}, Promise.resolve());
// fun为异步请求,经过retry包装后,
// 首先执行fun,如果失败, 则每隔delay的时间尝试一次,
// 直到成功,或者到达失败次数上限
function retry(fun, delay, times) {
let time = 0;
return new Promise((resolve, reject) => {
const again = () => {
Promise.resolve(fun())
.then(resolve)
.catch(() => {
if (time >= times) {
reject();
} else {
setTimeout(() => {
time++;
again();
}, delay)
}
})
};
again();
});
}