这是一道面试题实现一个批量请求函数 concurrentRequest(urls, maxNum),要求如下:
• 要求最大并发数 maxNum
• 每当有一个请求返回,就留下一个空位,可以增加新的请求
• 所有请求完成后,结果按照 urls 里面的顺序依次打出
先封装一个ajax
function ajax(url) {
return new Promise((resolve) => {
const xhr = new XMLHttpRequest()
xhr.open('get', url, true)
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200 || xhr.status === 304) {
resolve(xhr.responseText)
}
}
}
xhr.send()
})
}
并发请求函数
function concurrentRequest(urls, maxNum) {
return new Promise((resolve) => {
if (urls.length === 0) {
resolve([]);
return;
}
const result = [];
let index = 0;
async function request() {
if (index >= urls.length) {
return;
}
const i = index;
const url = urls[index];
index++;
try {
const res = await ajax(url);
result[i] = res;
} catch (error) {
result[i] = error;
} finally {
// 这个是相当于当前的这个通道完成后在继续-调用下一个接口
request();
}
}
// // 取最大并发数和url长度之间最小的作为并发请求数
const times = Math.min(max, urls.length);
for (let i = 0; i < times; i++) {
request();
}
resolve(result);
});