await-num-q
Version:
一个用于 处理 指定并行异步任务数量的 队列
183 lines • 12.4 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;
}
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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