task-manager.ts 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import { Task, Progress } from 'mol-task';
  7. import { RxEventHelper } from 'mol-util/rx-event-helper';
  8. import { now } from 'mol-util/now';
  9. export { TaskManager }
  10. class TaskManager {
  11. private ev = RxEventHelper.create();
  12. private id = 0;
  13. readonly events = {
  14. progress: this.ev<TaskManager.ProgressEvent>(),
  15. finished: this.ev<{ id: number }>()
  16. };
  17. private track(id: number) {
  18. return (progress: Progress) => {
  19. const elapsed = now() - progress.root.progress.startedTime;
  20. progress.root.progress.startedTime
  21. this.events.progress.next({
  22. id,
  23. level: elapsed < 250 ? 'none' : elapsed < 1500 ? 'background' : 'overlay',
  24. progress
  25. });
  26. };
  27. }
  28. async run<T>(task: Task<T>): Promise<T> {
  29. const id = this.id++;
  30. try {
  31. const ret = await task.run(this.track(id), 100);
  32. return ret;
  33. } finally {
  34. this.events.finished.next({ id });
  35. }
  36. }
  37. dispose() {
  38. this.ev.dispose();
  39. }
  40. }
  41. namespace TaskManager {
  42. export type ReportLevel = 'none' | 'background' | 'overlay'
  43. export interface ProgressEvent {
  44. id: number,
  45. level: ReportLevel,
  46. progress: Progress
  47. }
  48. function delay(time: number): Promise<void> {
  49. return new Promise(res => setTimeout(res, time));
  50. }
  51. export function testTask(N: number) {
  52. return Task.create('Test', async ctx => {
  53. let i = 0;
  54. while (i < N) {
  55. await delay(100 + Math.random() * 200);
  56. if (ctx.shouldUpdate) {
  57. await ctx.update({ message: 'Step ' + i, current: i, max: N, isIndeterminate: false });
  58. }
  59. i++;
  60. }
  61. })
  62. }
  63. }