🏠

Greasy Fork is available in English.

promise concurrency

基于promise 并发控制

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.greasyfork.org/scripts/488850/1336774/promise%20concurrency.js

提问、发表评价,或者 举报这个脚本
// ==/UserScript==
// @version               1.0
// ==/UserScript==
; (() => {
/**
* # 使用方法
* ```js
* await concurrentTasks(5, [1, 2, 3, 4], (n) => {
*   return new Promise((ok) => {
*     setTimeout(() => {
*       console.log(n);
*       ok();
*     }, Math.random() * 5000);
*   });
* });
* ```
* @template T
* @param {number} limit - 并发数
* @param {T[] | NodeListOf<T>} tasks - 可迭代对象
* @param {(task:T) => Promise<void>} asyncCallback - Promise 回调函数
* @returns {Promise<void>}
*/
const concurrentTasks = async (limit, tasks, asyncCallback) => {
limit = Math.min(limit, tasks.length);
let index = 0;
const run = async () => {
while (index < tasks.length) {
await asyncCallback(tasks[index++]);
}
};
const runTaks = Array.from({ length: limit }, () => run());
await Promise.all(runTaks);
};
window.concurrentTasks = concurrentTasks;
})();