在angular文档中,我看到了这两个函数,tick()flush().这两种方法似乎做了相似的事情.从angular文档中可以看出,对于tick:

模拟fakeAsync区域中计时器的异步时间流逝.

至于同花顺:

通过排空宏任务队列直到其为空,模拟fakeAsync区域中计时器的异步时间流逝.返回的值是经过的毫秒数.

谁能给我解释一下区别吗?

编辑(在 comments 中回答):

此外,在angular documentation中,tick()使用时没有参数,该行上的注释甚至使用了短语"flush"

it('should display error when TwainService fails', fakeAsync(() => {
  // tell spy to return an error observable
  getQuoteSpy.and.returnValue(
    throwError('TwainService test failure'));

  fixture.detectChanges(); // onInit()
  // sync spy errors immediately after init

  tick(); // flush the component's setTimeout()

  fixture.detectChanges(); // update errorMessage within setTimeout()

  expect(errorMessage()).toMatch(/test failure/, 'should display error');
  expect(quoteEl.textContent).toBe('...', 'should show placeholder');
}));

推荐答案

它们做的事情与以前的异步操作不同.例如调用setTimeout(...)将启动一个异步操作.

  • tick()向前移动time.
  • flush()移动time到最后.

这些函数的单元测试可以更好地说明这一点.

打上钩

这个单元测试显示,滴答声被用来将时间向前移动steps,直到所有10个计时器都完成.打上钩被多次调用.

https://github.com/angular/angular/blob/master/packages/core/test/fake_async_spec.ts#L205


      it('should clear periodic timers', fakeAsync(() => {
           let cycles = 0;
           const id = setInterval(() => { cycles++; }, 10);

           tick(10);
           expect(cycles).toEqual(1);

           discardPeriodicTasks();

           // 打上钩 once to clear out the timer which already started.
           tick(10);
           expect(cycles).toEqual(2);

           tick(10);
           // Nothing should change
           expect(cycles).toEqual(2);
         }));

脸红

这个单元测试表明,所有异步任务在返回时都应该完成,返回的值告诉您完成这些任务需要多长时间.

https://github.com/angular/angular/blob/master/packages/core/test/fake_async_spec.ts#L273

      it('should flush multiple tasks', fakeAsync(() => {
           let ran = false;
           let ran2 = false;
           setTimeout(() => { ran = true; }, 10);
           setTimeout(() => { ran2 = true; }, 30);

           let elapsed = flush();

           expect(ran).toEqual(true);
           expect(ran2).toEqual(true);
           expect(elapsed).toEqual(30);
         }));

Typescript相关问答推荐

如何从TypScript中的接口中正确获取特定键类型的所有属性?

更新:Typescript实用程序函数合并对象键路径

VS代码1.88.0中未出现自动导入建议

有没有一种方法可以在保持类型的可选状态的同时更改类型?

ANGLE找不到辅助‘路由出口’的路由路径

打字类型保护递归判断

已解决:如何使用值类型限制泛型键?

从泛型类型引用推断的文本类型

基元类型按引用传递的解决方法

Angular material 无法显示通过API获取的数据

Angular 16将独立组件作为对话框加载,而不进行布线或预加载

作为函数参数的联合类型的键

必需的输入()参数仍然发出&没有初始值设定项&q;错误

从以下内容之一提取属性类型

编剧- Select 动态下拉选项

将类型脚本函数返回类型提取到VSCode中的接口

递归类型别名的Typescript 使用

为什么看起来相似的代码在打字时会产生不同的错误?

如何实现允许扩展泛型函数参数的类型

导航链接不触发自定义挂钩