Common utils for mana
Common utils for mana.
 
``bash`
npm i mana-common --save
可销毁对象的定义,这里的销毁除有时候也代表撤销
`typescript`
interface Disposable {
/**
* Dispose this object.
*/
dispose: () => void;
}
提供了一些工具方法
`typescript`
namespace Disposable {
function is(arg: any): arg is Disposable; // 类型断言,判断是否为 Disposable 对象
function create(func: () => void): Disposable; // 将方法创建为 Disposable 对象
const NONE: Disposable; // 空的 Disposable 对象
}
#### 可销毁集合 DisposableCollection
可毁对象的集合
`typescript`
constructor(...toDispose: Disposable[]) // 基于可销毁对象的列表创建
push(disposable: Disposable): Disposable // 加入一个可销毁对象
pushAll(disposable: Disposable[]): Disposable[] // 加入多个可销毁对象
get onDispose(): Event
- 可销毁对象集合本身就是可销毁的,其销毁动作可以销毁几个内的所有对象。
- 可销毁对象的添加动作会返回一个可销毁对象,其销毁动作会撤销这些对象对集合的添加。
- 可销毁对象销毁事件的监听,也会返回一个可销毁对象,其销毁动作会撤销监听动作。
事件定义,通过 Emitter 定义和发起事件,通过 Event 订阅事件,一个常见的使用方式如下
`typescript`
class EventEmitter {
protected emitter = new Emitter
get onEventEmit(): Event
return emitter.event;
}
emit() {
emitter.fire();
}
}
const emitter = new EventEmitter();
const disposable = emitter.onEventEmit(() => {});
可以方便的设置 Event 的 listener 限制
`typescript`
emitter.onEventEmit.maxListeners = 10; // 默认为 0,即没有限制
可以遍历事件的订阅者, 返回 false 以中止遍历
`typescript`
emitter.sequence(listener => {
return true;
});
作为 promise 的生成工具使用, 其定义非常简单,完整定义如下
`typescript
export class Deferred
public resolve: (value: T | PromiseLike
public reject: (err?: any) => void;
public readonly promise: Promise
constructor() {
this.promise = new Promise
this.resolve = resolve;
this.reject = reject;
});
}
}
`
作为可中止操作的句柄使用,实际上中止器的作用并不是在函数的执行过程中中止执行,而是提供一个标志来判断是否被中止过,函数本身是会被调用完的.
- 执行结束后返回
`typescript`
const source = new CancellationTokenSource();
const wait = async (cb: () => Promise
await cb();
if (token.isCancellationRequested) {
return false;
}
return true;
};
wait(() => {
// do something
}, source.token);
source.cancel();
- 中止事立即返回
`typescript`
const source = new CancellationTokenSource();
// 中止时返回
const wait = async (cb: () => Promise
const waitDeferred = new Deferred
token.onCancellationRequested(() => {
waitDeferred.resolve(false);
});
cb().then(() => {
waitDeferred.resolve(true);
});
return waitDeferred.promise;
};
wait(() => {
// do something
}, source.token);
source.cancel();
对于同一操作在出错的情况下多次重试, 可设置重试间隔和重试次数上限
`typescript`
async function retry
在程序中设置一个可取消的延迟
`typescript``
function timeout(ms: number, token = CancellationToken.None): Promise