UNPKG

xpromisequeue

Version:

这是一个Javascript Promise的执行队列模块,里面的每一个Promise都是按顺序执行的,您也可以指定一定的优先级来决定队列的执行顺序。

192 lines (191 loc) 5.26 kB
/** * ****************************************************************************************** * 开源协议:https://github.com/xucongli1989/xPromiseQueue/blob/master/LICENSE * 项目地址:https://github.com/xucongli1989/xPromiseQueue * 电子邮件:80213876@qq.com * By XCL 2017.08 in Shenzhen. China ******************************************************************************************** */ /** * Promise状态 */ export declare enum PromiseStatus { None = "none", Pending = "pending", Fulfilled = "fulfilled", Rejected = "rejected", } /** * 优先级 */ export declare enum Priority { Low = "low", High = "high", Highest = "highest", } export declare class QueuePromiseContext { constructor(); queuePms: Promise<any>; resolve: () => void; init(): void; } /** * 执行项 */ export declare class QItem { /** * 初始函数 */ private _resolve; private _reject; private _pms; private _pmsStatus; constructor(fun: () => void); /** * 初始化时的选项 */ private initOptions; /** * 唯一标识 */ id: string; /** * 名称 */ name: string; /** * 下一个执行项 */ next: QItem; /** * 队列Promise上下文 */ queuePromiseContext: QueuePromiseContext; /** * 执行该队列项 */ run(): Promise<any>; /** * resolve */ resolve(): void; /** * reject */ reject(): void; /** * 获取该Promise状态 */ getPmsStatus(): PromiseStatus; /** * 从队列中销毁后需要执行的函数 */ destroyCallback: () => void; /** * 是否已完成(已解决或已拒绝) */ isComplete(): boolean; /** * 是否在处理中(Pending) */ isPending(): boolean; /** * 是否已拒绝(Rejected) */ isRejected(): boolean; /** * clone队列项 */ clone(): QItem; } /** * 模块主体 */ export declare class Queue { private _promiseContext; /** * 是否为监听中 */ private _isWatching; /** * 当前队列是否已锁定(true:不允许再注册新的执行项) */ private _isLock; /** * 待执行的Promise队列 */ private _qList; /** * 将当前队列中的每一项按实际执行顺序重新排列 */ private _reSortQList(); /** * 注册一个Promise项到执行队列中。 * 如果当前队列未运行,则仅仅是将该项添加至队列中而已。 * 如果当前队列处于运行中,则不仅仅是将该项添加到队列中,还会根据该项实际所在的位置来判断是否立刻运行此项。 * @param item 执行项 * @param priority 优先级(默认为低。【低】:添加到队列的末尾;【高】:添加到紧挨着当前正在执行的队列项的后面;【最高】:添加到当前正在执行的队列项的前面) */ reg(item: QItem, priority?: Priority): Queue; /** * 注册唯一的一个队列项。此方法会先销毁整个队列,再重新注册只有一个执行项的队列。注册完后,会锁定此队列。 * @param item 队列项 * @param isForce 是否绕过队列锁定并强制注册(默认为true) */ regUnique(item: QItem, isForce?: Boolean): Queue; /** * 注册一个新的队列项到一个已有且未完成的队列项的后面 * @param parent 已有的未完成的队列项 * @param newItem 此次新加的队列项(parent执行完后,才会执行newItem) */ regAfter(parent: QItem, newItem: QItem): Queue; /** * 注册一个新的队列项到一个已有且未完成的队列项的前面 * @param lastItem 已有的未完成的队列项 * @param newItem 此次新加的队列项(newItem执行完后,才会执行lastItem) */ regBefore(lastItem: QItem, newItem: QItem): Queue; /** * 运行队列 */ run(): Queue; /** * 获取当前正在执行中的队列项(运行时,队列中第一个状态为Pending的项) */ getCur(): QItem; /** * 锁定队列,不允许再修改队列 */ lock(): Queue; /** * 解锁队列,允许修改队列 */ unLock(): Queue; /** * 销毁指定队列项 * 此方法不会去调用该项的解决或拒绝,直接从队列中删除此项 * @param item 要销毁的队列项 */ destroy(item: QItem): Queue; /** * 销毁整个队列 */ clear(): Queue; /** * 判断当前时刻队列是否已全部运行完 */ isComplete(): boolean; /** * 是否为监听中 */ isWatching(): boolean; /** * 获取当前时刻表示整个队列是否完成的Promise对象 */ getCurPms(): Promise<any>; /** * 根据队列项的id查找队列项 * @param id 队列项的id */ getQItemById(id: string): QItem; }