UNPKG

await-num-q

Version:

一个用于 处理 指定并行异步任务数量的 队列

183 lines 12.4 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _asyncQueue_Queue, _asyncQueue_runNum, _asyncQueue_retry, _asyncQueue_maxNum, _asyncQueue_status, _asyncQueue_endCallback; Object.defineProperty(exports, "__esModule", { value: true }); exports.MergeAsync = exports.asyncQueue = void 0; /** * 异步队列 */ class asyncQueue { constructor({ max, retry, endCallback, }) { _asyncQueue_Queue.set(this, []); _asyncQueue_runNum.set(this, 0); _asyncQueue_retry.set(this, 0); _asyncQueue_maxNum.set(this, 3); _asyncQueue_status.set(this, "end"); _asyncQueue_endCallback.set(this, void 0); if (max) { __classPrivateFieldSet(this, _asyncQueue_maxNum, max, "f"); } if (retry) { __classPrivateFieldSet(this, _asyncQueue_retry, retry, "f"); } __classPrivateFieldSet(this, _asyncQueue_endCallback, endCallback || function () { }, "f"); } /** * 添加任务 * @param f 目标函数 * @param callback 成功回调函数 * @param err 错误回调函数 * @returns 添加成功与否 */ push(f, callback, err) { if (f.constructor.name !== "Function") { return false; } let funObj = { status: "wait", target: f, retry: __classPrivateFieldGet(this, _asyncQueue_retry, "f"), callback, err, }; __classPrivateFieldGet(this, _asyncQueue_Queue, "f").push(funObj); this.clear(); return true; } /** * 清除运行完成的任务 */ clear(fial = false) { __classPrivateFieldSet(this, _asyncQueue_Queue, __classPrivateFieldGet(this, _asyncQueue_Queue, "f").filter((item) => item.status !== "end" && fial ? item.status !== "fail" : true), "f"); } /** * 添加并运行任务 若是没有传入函数 运行 之前传入的任务 * @param f 目标函数 * @param callback 成功回调函数 * @param err 错误回调函数 * @returns 添加成功与否 */ run(f, callback, err) { return __awaiter(this, void 0, void 0, function* () { var _a, _b; if (f) { this.push(f, callback, err); } if (__classPrivateFieldGet(this, _asyncQueue_runNum, "f") >= __classPrivateFieldGet(this, _asyncQueue_maxNum, "f")) { return; } let fun = null; for (let f of __classPrivateFieldGet(this, _asyncQueue_Queue, "f")) { if (f.status == "wait") { fun = f; break; } } if (fun) { let data = null; try { __classPrivateFieldSet(this, _asyncQueue_status, "ing", "f"); fun.status = "ing"; __classPrivateFieldSet(this, _asyncQueue_runNum, (_a = __classPrivateFieldGet(this, _asyncQueue_runNum, "f"), _a++, _a), "f"); data = yield fun.target(); if (fun.callback instanceof Function) { fun.callback(data); } fun.status = "end"; } catch (e) { if (fun.err instanceof Function) { if (fun.retry > 0) { fun.status = "wait"; fun.retry--; } else { fun.err(e); fun.status = "fail"; } } } finally { __classPrivateFieldSet(this, _asyncQueue_runNum, (_b = __classPrivateFieldGet(this, _asyncQueue_runNum, "f"), _b--, _b), "f"); this.run(); } } else { for (let f of __classPrivateFieldGet(this, _asyncQueue_Queue, "f")) { if (f.status != "end" && f.status != "fail") { return; } } // if (this.#status == "ing") { __classPrivateFieldSet(this, _asyncQueue_status, "end", "f"); __classPrivateFieldGet(this, _asyncQueue_endCallback, "f").call(this); // }else if(this.#Queue.length === 0){ // this.#endCallback(); // } } }); } /** * 获取所有的 任务 * @returns */ getTasks() { return __classPrivateFieldGet(this, _asyncQueue_Queue, "f"); } /** * 异步运行并得到返回值 * @param fun 目标函数 * @returns */ wait(fun) { return __awaiter(this, void 0, void 0, function* () { return yield new Promise((rej, rea) => { this.run(fun, rej, rea); }); }); } } exports.asyncQueue = asyncQueue; _asyncQueue_Queue = new WeakMap(), _asyncQueue_runNum = new WeakMap(), _asyncQueue_retry = new WeakMap(), _asyncQueue_maxNum = new WeakMap(), _asyncQueue_status = new WeakMap(), _asyncQueue_endCallback = new WeakMap(); const mergePromise = new WeakMap(); /** * 在某个异步请求 参数相同 返回的值相同 * 并且在同一时间段 会发送多个亲求的场景 * 压缩正在进行的异步请求 为一个 * 避免同时条用多个请求导致后续请求 挂起 * @param asyncFun 异步函数 * @param param 函数传参 必须传入支持序列化的 * @returns */ function MergeAsync(asyncFun, ...param) { return __awaiter(this, void 0, void 0, function* () { let key = JSON.stringify(param); if (mergePromise.has(key)) { return mergePromise.get(key); } let r = (yield asyncFun(...param)); mergePromise.delete(key); return r; }); } exports.MergeAsync = MergeAsync; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBOztHQUVHO0FBQ0gsTUFBYSxVQUFVO0lBT3JCLFlBQVksRUFDVixHQUFHLEVBQ0gsS0FBSyxFQUNMLFdBQVcsR0FDQztRQVZkLDRCQUFzQixFQUFFLEVBQUM7UUFDekIsNkJBQVUsQ0FBQyxFQUFDO1FBQ1osNEJBQVMsQ0FBQyxFQUFDO1FBQ1gsNkJBQVUsQ0FBQyxFQUFDO1FBQ1osNkJBQXlCLEtBQUssRUFBQztRQUMvQiwwQ0FBeUI7UUFNdkIsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLHVCQUFBLElBQUksc0JBQVcsR0FBRyxNQUFBLENBQUM7UUFDckIsQ0FBQztRQUNELElBQUksS0FBSyxFQUFFLENBQUM7WUFDVix1QkFBQSxJQUFJLHFCQUFVLEtBQUssTUFBQSxDQUFDO1FBQ3RCLENBQUM7UUFFRCx1QkFBQSxJQUFJLDJCQUFnQixXQUFXLElBQUksY0FBYyxDQUFDLE1BQUEsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsSUFBSSxDQUFDLENBQVcsRUFBRSxRQUFtQixFQUFFLEdBQWM7UUFDbkQsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN0QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxJQUFJLE1BQU0sR0FBYztZQUN0QixNQUFNLEVBQUUsTUFBTTtZQUNkLE1BQU0sRUFBRSxDQUFDO1lBQ1QsS0FBSyxFQUFFLHVCQUFBLElBQUkseUJBQU87WUFDbEIsUUFBUTtZQUNSLEdBQUc7U0FDSixDQUFDO1FBQ0YsdUJBQUEsSUFBSSx5QkFBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixPQUFPLElBQUksQ0FBQztJ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