大约两个月前,有人帮我解决了一个异步问题,它运行得很好(我已经为它添加了分配),但是我的程序中仍然有这样的代码,我不完全确定它能做什么。
最初的守则是:
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回合中没有更多的微任务进入队列时通知”。
3) first() 这个方法的唯一解释是来自w3school:“第一个()方法返回所选元素的第一个元素。”所以我不明白的是,在上面的代码中,我选择了哪些元素。我试着在这上面运行一个console.dir和.log,但是我得到的只有[object Object]。所以我想知道第一个元素是什么?
4) 订阅()--我真的不知道为什么这里有订阅。我的印象是,你只能接受可观察的诺言。您是否可以订阅任何可以通过更改进行更改的内容,然后在发生更改时运行订阅代码块?如果是,在前面的方法中,触发订阅运行的方法是什么?
我希望我似乎已经尝试并寻找了上述问题的答案,但一切似乎都是为那些一开始就不需要阅读的人而写的.
发布于 2017-03-15 18:25:55
Vm不是虚拟机,我也不知道它是什么,但是manage中的Zone是帮助您管理多异步操作的执行上下文。更多关于这件事。
this.ngZone.onMicrotaskEmpty是一个可观察的流,而first()是一个操作符,它返回该流发出的第一个值,因为随着时间的推移,一个可观测的流可能有许多不同的值。
subscribe()是从该流获取值的唯一方法,或者当有一些值被推送到该流时会得到通知。
我建议你读一些关于区域和Rxjs可观测值的文章,这样可以消除你的困惑。
发布于 2019-09-13 03:43:58
关于onMicrotaskEmpty,您需要了解的是它等待微任务队列为空,而不是宏任务。
微任务的任务直接是正在执行的代码的一部分。因此,在您的代码中,您进行了一个HTTP调用,并等待它通过一个承诺(即microtask中的承诺)来解决。
宏任务队列具有更全局的任务。例如,鼠标移动,或setTimeout中的某些内容。
因此,当您等待microtask为空时,这意味着您希望在当前“进程”完成后,但在引擎处理宏任务中的下一个任务之前,立即运行。
也请看这个答案作进一步讨论
希望这有帮助
https://stackoverflow.com/questions/42803620
复制相似问题