并发请求函数batchRequests
【题目】请实现如下的函数,可以批量请求数据,
【要求】
- 所有的请求在tasks参数中,同时可以通过max参数 控制请求的并发度
- 当所有的请求结束后,需要执行callback回调。
- 请求结果返回顺序需要和请求顺序保持一致
// 请实现如下的函数,可以批量请求数据,
// 所有的请求在tasks参数重,同时可以通过max参数 控制请求的并发度。
// 当所有的请求结束后,需要执行callback回调。// 参考答案
/*** 任务队列* @param tasks 请求数组* @param maxNum 最大并发数* @param callTime 错误重发次数* @param callback 回调*/
class TaskQueue {constructor(tasks, maxNum, callback) {this.queue = tasks;this.maxNum = maxNum;this.callback = callback;this.results = [];this.running = 0;this.next();}next() {while (this.running < this.maxNum && this.queue.length) {const task = this.queue.shift();const run = async (task) => {try {const res = await task(task);this.results.push(res);this.running--;this.next();} catch (e) {this.results.push(e);this.running--;this.next();}};run.call(this, task);this.running++;}if (typeof this.callback === 'function' && this.running == 0) {this.callback.call(null, this.results);}}
}// 以下为调用示例
var p1 = () => new Promise((resolve, reject) => setTimeout(reject, 3000, 'p1'));
var p2 = () => new Promise((resolve, reject) => setTimeout(resolve, 5000, 'p2'));
var p3 = () => new Promise((resolve, reject) => setTimeout(reject, 3000, 'p3'));
var p4 = () => new Promise((resolve, reject) => setTimeout(resolve, 3000, 'p4'));
var p5 = () => new Promise((resolve, reject) => setTimeout(reject, 3000, 'p5'));
var p6 = () => new Promise((resolve, reject) => setTimeout(resolve, 3000, 'p6'));
var p7 = () => new Promise((resolve, reject) => setTimeout(reject, 3000, 'p7'));
var tasks = [p1, p2, p3, p4, p5, p6, p7];
function sendRequest(ww, max, callback) {new TaskQueue(ww, max, callback);
}sendRequest(tasks, 2, (result) => {console.log(result);console.log('success');
});