fix: add token to unregister await handler

This commit is contained in:
pelikhan 2023-02-13 11:03:04 -08:00
Родитель 0b45b6cffe
Коммит 4c3e450468
1 изменённых файлов: 24 добавлений и 1 удалений

Просмотреть файл

@ -63,6 +63,25 @@ export function dependencyId(nodes: IEventSource | IEventSource[]) {
let nextNodeId = 0 let nextNodeId = 0
/**
* Collects unsubscribe handlers and unmounts them
*/
export class JDCancellationToken {
private subscriptions: (() => void)[] = []
constructor() {}
mount(...items: (() => void)[]) {
this.subscriptions.push(...items)
}
unmount() {
const us = this.subscriptions
this.subscriptions = []
us.forEach(unsub => unsub())
}
}
/** /**
* Base class for evented nodes in Jacdac * Base class for evented nodes in Jacdac
* @category JDOM * @category JDOM
@ -141,12 +160,16 @@ export class JDEventSource implements IEventSource {
* @param eventName * @param eventName
* @param timeout * @param timeout
*/ */
async awaitOnce(eventName: string | string[]): Promise<void> { async awaitOnce(
eventName: string | string[],
token?: JDCancellationToken
): Promise<void> {
if (!eventName) return if (!eventName) return
const p = new Promise<void>(resolve => { const p = new Promise<void>(resolve => {
const handler = () => resolve?.() const handler = () => resolve?.()
this.once(eventName, handler) this.once(eventName, handler)
token?.mount(() => this.off(eventName, handler))
}) })
return p return p
} }