js
function mockFetch(param) {
return new Promise((resovle) => {
setTimeout(() => {
resovle(param);
}, 2000);
});
}
Promise.myAll = function (promiseArr) {
let res, rej;
const p = new Promise((resolve, reject) => {
res = resolve
rej = reject
})
let count = 0
let i = 0
const result = []
let fullfilledCount = 0
for (const promise of promiseArr) {
const index = i
i++
count++
Promise.resolve(promise).then((data) => {
result[index] = data
fullfilledCount++
if (fullfilledCount === count) {
res(result)
}
}, rej)
}
if (count === 0) {
res(result)
}
return p
}
function limitedRequest(urls, maxNum) {
let result = [];
let index = 0;
const pool = [];
const initSize = Math.min(urls.length, maxNum);
for (let i = 0; i < initSize; i++) {
pool.push(run(urls.splice(0, 1)[0], index));
index++;
}
function core(data, i) {
result[i] = data;
if (urls.length === 0) {
return Promise.resolve(result);
}
let p = run(urls.splice(0, 1)[0], index);
index++;
return p;
}
function run(url, index) {
return mockFetch(url).then((data) => core(data, index));
}
return Promise.myAll(pool).then((data) => {
return Promise.resolve(data[0]);
});
}
console.time('测试耗时');
limitedRequest([1, 2, 3, 4, 5, 6, 7, 8], 3).then((data) => {
console.log(data);
console.timeEnd('测试耗时');
});