Skip to content

Commit

Permalink
feat(scheduler): add yieldAll api
Browse files Browse the repository at this point in the history
  • Loading branch information
fkleuver committed Oct 26, 2019
1 parent 399f84a commit f39c640
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 2 deletions.
20 changes: 19 additions & 1 deletion packages/runtime-html-browser/src/browser-scheduler.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { IContainer } from '@aurelia/kernel';
import { IContainer, bound } from '@aurelia/kernel';
import { IDOM, IScheduler, TaskQueuePriority, TaskQueue, IClock, TaskCallback, QueueTaskOptions, Task, DOM, ITaskQueue, ITask, QueueTaskTargetOptions } from '@aurelia/runtime';
import { HTMLDOM } from '@aurelia/runtime-html';

Expand Down Expand Up @@ -430,21 +430,39 @@ export class BrowserScheduler implements IScheduler {
return this.taskQueue[TaskQueuePriority.idle];
}

@bound
public yieldMicroTask(): Promise<void> {
return this.taskQueue[TaskQueuePriority.microTask].yield();
}
@bound
public yieldRenderTask(): Promise<void> {
return this.taskQueue[TaskQueuePriority.render].yield();
}
@bound
public yieldMacroTask(): Promise<void> {
return this.taskQueue[TaskQueuePriority.macroTask].yield();
}
@bound
public yieldPostRenderTask(): Promise<void> {
return this.taskQueue[TaskQueuePriority.postRender].yield();
}
@bound
public yieldIdleTask(): Promise<void> {
return this.taskQueue[TaskQueuePriority.idle].yield();
}
@bound
public yieldAll(): Promise<void> {
// Yield sequentially from "large" to "small" so that any smaller tasks initiated by larger tasks are also still awaited,
// as well as guaranteeing a single round of persistent tasks from each queue.
// Don't change the order or into parallel, without thoroughly testing the ramifications on persistent and recursively queued tasks.
// These aspects are currently relatively poorly tested.
return Promise.resolve()
.then(this.yieldIdleTask)
.then(this.yieldPostRenderTask)
.then(this.yieldMacroTask)
.then(this.yieldRenderTask)
.then(this.yieldMicroTask);
}

public queueMicroTask<T = any>(callback: TaskCallback<T>, opts?: QueueTaskOptions): ITask<T> {
return this.taskQueue[TaskQueuePriority.microTask].queueTask(callback, opts);
Expand Down
16 changes: 15 additions & 1 deletion packages/runtime-html-jsdom/src/jsdom-scheduler.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { IContainer, PLATFORM } from '@aurelia/kernel';
import { IContainer, PLATFORM, bound } from '@aurelia/kernel';
import { IDOM, QueueTaskOptions, TaskQueuePriority, IScheduler, TaskQueue, IClock, TaskCallback, Task, DOM, ITaskQueue, ITask, QueueTaskTargetOptions } from '@aurelia/runtime';
import { HTMLDOM } from '@aurelia/runtime-html';

Expand Down Expand Up @@ -375,21 +375,35 @@ export class JSDOMScheduler implements IScheduler {
return this.taskQueue[TaskQueuePriority.idle];
}

@bound
public yieldMicroTask(): Promise<void> {
return this.taskQueue[TaskQueuePriority.microTask].yield();
}
@bound
public yieldRenderTask(): Promise<void> {
return this.taskQueue[TaskQueuePriority.render].yield();
}
@bound
public yieldMacroTask(): Promise<void> {
return this.taskQueue[TaskQueuePriority.macroTask].yield();
}
@bound
public yieldPostRenderTask(): Promise<void> {
return this.taskQueue[TaskQueuePriority.postRender].yield();
}
@bound
public yieldIdleTask(): Promise<void> {
return this.taskQueue[TaskQueuePriority.idle].yield();
}
@bound
public yieldAll(): Promise<void> {
return Promise.resolve()
.then(this.yieldIdleTask)
.then(this.yieldPostRenderTask)
.then(this.yieldMacroTask)
.then(this.yieldRenderTask)
.then(this.yieldMicroTask);
}

public queueMicroTask<T = any>(callback: TaskCallback<T>, opts?: QueueTaskOptions): ITask<T> {
return this.taskQueue[TaskQueuePriority.microTask].queueTask(callback, opts);
Expand Down
1 change: 1 addition & 0 deletions packages/runtime/src/scheduler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ export interface IScheduler {
yieldMacroTask(): Promise<void>;
yieldPostRenderTask(): Promise<void>;
yieldIdleTask(): Promise<void>;
yieldAll(): Promise<void>;

queueMicroTask<T = any>(callback: TaskCallback<T>, opts?: QueueTaskOptions): ITask<T>;
queueRenderTask<T = any>(callback: TaskCallback<T>, opts?: QueueTaskOptions): ITask<T>;
Expand Down

0 comments on commit f39c640

Please sign in to comment.