await-num-q
Version:
一个用于 处理 指定并行异步任务数量的 队列
191 lines • 12.7 kB
JavaScript
"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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