promise concurrency

基于promise 并发控制

이 스크립트는 직접 설치하는 용도가 아닙니다. 다른 스크립트에서 메타 지시문 // @require https://update.greasyfork.org/scripts/488850/1336774/promise%20concurrency.js을(를) 사용하여 포함하는 라이브러리입니다.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==/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;
})();