UNPKG

await-num-q

Version:

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

191 lines 12.7 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; } // 队列对象 运行时 const 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 (const 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 (const f of __classPrivateFieldGet(this, _asyncQueue_Queue, "f")) { if (f.status != "end" && f.status != "fail") { return; } } __classPrivateFieldSet(this, _asyncQueue_status, "end", "f"); __classPrivateFieldGet(this, _asyncQueue_endCallback, "f").call(this); } }); } get status() { return __classPrivateFieldGet(this, _asyncQueue_status, "f"); } /** * 获取所有的 任务 * @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* () { const key = JSON.stringify(param); if (mergePromise.has(key)) { return mergePromise.get(key); } mergePromise.set(key, asyncFun(...param)); const r = (yield asyncFun(...param)); mergePromise.delete(key); return r; }); } exports.MergeAsync = MergeAsync; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUJBOztHQUVHO0FBQ0gsTUFBYSxVQUFVO0lBYXJCLFlBQVksRUFDVixHQUFHLEVBQ0gsS0FBSyxFQUNMLFdBQVcsR0FDQztRQWhCZCw0QkFBc0IsRUFBRSxFQUFDO1FBQ3pCLDZCQUFVLENBQUMsRUFBQztRQUNaLDRCQUFTLENBQUMsRUFBQztRQUNYOztXQUVHO1FBQ0gsNkJBQVUsQ0FBQyxFQUFDO1FBQ1o7O1dBRUc7UUFDSCw2QkFBeUIsS0FBSyxFQUFDO1FBQy9CLDBDQUF5QjtRQU12QixJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ1IsdUJBQUEsSUFBSSxzQkFBVyxHQUFHLE1BQUEsQ0FBQztRQUNyQixDQUFDO1FBQ0QsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLHVCQUFBLElBQUkscUJBQVUsS0FBSyxNQUFBLENBQUM7UUFDdEIsQ0FBQztRQUVELHVCQUFBLElBQUksMkJBQWdCLFdBQVcsSUFBSSxjQUFjLENBQUMsTUFBQSxDQUFDO0lBQ3JELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUFJLENBQW1CLENBQUksRUFBRSxRQUE4QixFQUFFLEdBQXFCO1FBQ2hGLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDdEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsV0FBVztRQUNYLE1BQU0sTUFBTSxHQUFjO1lBQ3hCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsTUFBTSxFQUFFLENBQUM7WUFDVCxLQUFLLEVBQUUsdUJBQUEsSUFBSSx5QkFBTztZQUNsQixRQUFRO1lBQ1IsR0FBRztTQUNKLENBQUM7UUFDRix1QkFBQSxJQUFJLHlCQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxL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