this._ngZone.onMicrotaskEmpty.first() - 代码

时间:2017-03-15 07:37:07

标签: angular

有人在大约2个月之前帮助我解决了异步问题,它工作得很好(我已经添加了分配给它),但我的程序中仍然有这个代码,我不完全确定它的作用。

原始代码是:

constructor(private ngZone: NgZone) { }

ngOnInit() { 
   this.getPosts()
     .subscribe(x => { 
        this.apidata = x;
        this.ngZone.onMicrotaskEmpty.first().subscribe(() => {
          this.largestHeight(); 
        });
      });
}

现在很难获得有关此文档的文档,而且我已经在过去的两个月内尝试过。他们只是给出了一个定义,但不是真实的例子。实际行是this.ngZone.onMicrotaskEmpty.first().subscribe(()

1)所以 ngZone 基本上可以访问您正忙着的区域,我理解这70%

2) onMicrotaskEmpty "当前虚拟机中没有更多微小任务排队时通知

  • a)首先,VM代表"虚拟机"?这很难 得到这个的定义。
  • b)是否在整个应用程序的微任务队列时通知 空的,还是只是组件?如果它是整个应用程序,我放 这段代码也在另一个组件中,当队列为空时,哪一个会先运行?
  • c)它说它暗示Angular运行变化检测。那是什么呢 "提示"意思?什么时候Angular会改变检测并且什么时候会被取消 它?
  • d)如果我用onStable更改onMicrotaskEmpty,代码仍会运行 精细。它们基本上是一回事吗? (它们都在所有微任务完成时运行)

3) first()我得到的这个方法的唯一解释来自w3school:" first()方法返回所选元素的第一个元素。&# 34; 所以我不理解的是在上面的代码中,我选择了哪些元素。我尝试在此运行一个console.dir和.log,但我得到的只是[object Object]。所以我想知道第一个的哪些元素?

4) subscribe()我真的不知道为什么这里有订阅。我的印象是你只能订阅可观察的/承诺。你可以订阅任何可以改变的东西,然后在它发生变化时运行订阅代码块吗?如果是这样,以前的方法中的哪个方法是更改​​触发订阅运行的方法?

我希望我似乎已经尝试并寻找上述答案,但似乎所有内容都是为那些不需要首先阅读它的人写的......:P

2 个答案:

答案 0 :(得分:2)

Vm不是虚拟机,我不知道它是什么,但Angular中的Zone是一个执行上下文,可以帮助您管理多个异步操作。 更多关于它的信息。

Understanding Zone

this.ngZone.onMicrotaskEmpty是一个Observable流,first()是一个运算符,它返回该流发出的第一个值,因为可观察的流可以随时间变化有许多不同的值

subscribe()是从该流获取值的唯一方法,或者当某些值被推送到该流时被通知

我建议您阅读有关区域和Rxjs可观察量的内容,它会清除您的大部分混淆

答案 1 :(得分:0)

您需要了解的onMicrotaskEmpty是,它等待微任务队列为空,而不是宏任务

微任务的任务直接属于您正在执行的代码。因此,请说在您的代码中进行HTTP调用,并等待其通过承诺解决- 在微任务中。

宏任务队列中的任务更具全局性。例如,鼠标移动或setTimeout中的某物。

因此,当您等待微任务为空时,这意味着您要在当前“进程”完成之后但在引擎处理宏任务中的下一个任务之前立即运行。

Also see this answer进行进一步的讨论

希望有帮助