主要测试 Scheduler 在浏览器中的运行。主要利用 MessageChannel API 进行异步执行 Task
environment
模拟浏览器 MessageChannel API,Mock了 port1 用于异步 onmessage,port2 用于 postmessage
在 port1的 onmessage 赋值了 performWorkUntilDeadline,此函数执行work直至当前 时间切片结束,默认时间切片时间为5ms,时间切片结束,将会把控制权交还给主线程,用于响应用户事件等。
1. task that finishes before deadline
1 | it('task that finishes before deadline', () => { |
2. task with continuation
1 | it('task with continuation', () => { |
callback 返回子work,但是会在下一个 message event 事件中执行
3. multiple tasks
1 | it('multiple tasks', () => { |
4. multiple tasks with a yield in between
1 | it('multiple tasks with a yield in between', () => { |
5. throws when a task errors then continues in a new event
1 | it('throws when a task errors then continues in a new event', () => { |
如果 task 执行报错,后面的任务会在下一个 message event 中继续执行 因为在 workLoop 中在执行任务前会先将 task.callback 设置为null,就是取消任务