业务需求是在做分片上传时,大文件分片数量较多,如果不控制并发量,会导致服务器压力过大,所以需要使用该方法解决并发问题。
/**
* 控制并发
* @param concurrency
* @return {function(*): Promise<unknown>}
*/
function pLimit(concurrency) {
if (!((Number.isInteger(concurrency) || concurrency === Infinity) && concurrency > 0)) {
throw new TypeError('Expected `concurrency` to be a number from 1 and up');
}
var queue = [];
var activeCount = 0;
var next = function () {
activeCount--;
if (queue.length > 0) {
queue.shift()();
}
};
var run = function (fn, resolve) {
activeCount++;
var result = new Promise(function (resolveInner) {
resolveInner(fn.apply(null, Array.prototype.slice.call(arguments, 2)));
});
resolve(result);
result.then(next, next);
};
var enqueue = function (fn, resolve) {
queue.push(run.bind(null, fn, resolve));
Promise.resolve().then(function () {
if (activeCount < concurrency && queue.length > 0) {
queue.shift()();
}
});
};
var generator = function (fn) {
var args = Array.prototype.slice.call(arguments, 1);
return new Promise(function (resolve) {
enqueue.apply(null, [fn, resolve].concat(args));
});
};
Object.defineProperties(generator, {
activeCount: {
get: function () {
return activeCount;
}
},
pendingCount: {
get: function () {
return queue.length;
}
},
clearQueue: {
value: function () {
queue.length = 0;
}
}
});
return generator;
}
/*-----------------------------------*/
/*-----------------------------------*/
/* 定义并发控制力量*/
var uploadLimit = pLimit(10);
/* 使用---->> */
var fileArrLimit = [];
fileArrLimit.push(uploadLimit(function (){
return new Promise(function (resolve){
//......
resolve();
})
}))
/* 使用完成监测 */
Promise.all(fileArrLimit).then(function () {
}).catch(function () {
})