diff --git a/src/mol-plugin/util/task-manager.ts b/src/mol-plugin/util/task-manager.ts index 3c5cbb47e72aa442378ceae3bdd8df06d1193a30..d053c4a618e29b5c8c93b05210d44c8d6d002c06 100644 --- a/src/mol-plugin/util/task-manager.ts +++ b/src/mol-plugin/util/task-manager.ts @@ -13,18 +13,21 @@ export { TaskManager } class TaskManager { private ev = RxEventHelper.create(); private id = 0; + private abortRequests = new Map<number, string | undefined>(); readonly events = { progress: this.ev<TaskManager.ProgressEvent>(), finished: this.ev<{ id: number }>() }; - private track(id: number) { + private track(internalId: number, taskId: number) { return (progress: Progress) => { + if (progress.canAbort && progress.requestAbort && this.abortRequests.has(taskId)) { + progress.requestAbort(this.abortRequests.get(taskId)); + } const elapsed = now() - progress.root.progress.startedTime; - progress.root.progress.startedTime this.events.progress.next({ - id, + id: internalId, level: elapsed < 250 ? 'none' : elapsed < 1500 ? 'background' : 'overlay', progress }); @@ -34,13 +37,18 @@ class TaskManager { async run<T>(task: Task<T>): Promise<T> { const id = this.id++; try { - const ret = await task.run(this.track(id), 100); + const ret = await task.run(this.track(id, task.id), 100); return ret; } finally { this.events.finished.next({ id }); + this.abortRequests.delete(task.id); } } + requestAbort(task: Task<any> | number, reason?: string) { + this.abortRequests.set(typeof task === 'number' ? task : task.id, reason); + } + dispose() { this.ev.dispose(); }