首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >this._ngZone.onMicrotaskEmpty.first() -代码解释

this._ngZone.onMicrotaskEmpty.first() -代码解释
EN

Stack Overflow用户
提问于 2017-03-15 07:37:07
回答 2查看 2.3K关注 0票数 13

大约两个月前,有人帮我解决了一个异步问题,它运行得很好(我已经为它添加了分配),但是我的程序中仍然有这样的代码,我不完全确定它能做什么。

最初的守则是:

代码语言:javascript
复制
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“在当前VM回合中没有更多的微任务进入队列时通知”。

  • 首先,虚拟机是否代表“虚拟机”?要弄清楚这一点是很困难的。
  • 它是通知整个应用程序的微任务队列是空的,还是只通知组件?如果它是整个应用程序,并且我也将这段代码放在另一个组件中,那么当队列为空时,哪个程序将首先运行?
  • ( c)它暗示要进行角度变化检测。那么“暗示”是什么意思?什么时候角跑会改变检测,什么时候不会呢?
  • ( d)如果我用onMicrotaskEmpty修改onStable,代码仍然运行良好。他们基本上是一样的吗?(当所有的微任务完成后,它们都会运行)

3) first() 这个方法的唯一解释是来自w3school:“第一个()方法返回所选元素的第一个元素。”所以我不明白的是,在上面的代码中,我选择了哪些元素。我试着在这上面运行一个console.dir和.log,但是我得到的只有[object Object]。所以我想知道第一个元素是什么?

4) 订阅()--我真的不知道为什么这里有订阅。我的印象是,你只能接受可观察的诺言。您是否可以订阅任何可以通过更改进行更改的内容,然后在发生更改时运行订阅代码块?如果是,在前面的方法中,触发订阅运行的方法是什么?

我希望我似乎已经尝试并寻找了上述问题的答案,但一切似乎都是为那些一开始就不需要阅读的人而写的.

EN

回答 2

Stack Overflow用户

发布于 2017-03-15 18:25:55

Vm不是虚拟机,我也不知道它是什么,但是manage中的Zone是帮助您管理多异步操作的执行上下文。更多关于这件事。

理解区

this.ngZone.onMicrotaskEmpty是一个可观察的流,而first()是一个操作符,它返回该流发出的第一个值,因为随着时间的推移,一个可观测的流可能有许多不同的值。

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

我建议你读一些关于区域和Rxjs可观测值的文章,这样可以消除你的困惑。

票数 2
EN

Stack Overflow用户

发布于 2019-09-13 03:43:58

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

微任务的任务直接是正在执行的代码的一部分。因此,在您的代码中,您进行了一个HTTP调用,并等待它通过一个承诺(即microtask中的承诺)来解决。

宏任务队列具有更全局的任务。例如,鼠标移动,或setTimeout中的某些内容。

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

也请看这个答案作进一步讨论

希望这有帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42803620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档