在ngOnInit()处触发StreamController

时间:2018-10-24 19:19:22

标签: dart angular-dart dart-html

Taking this example from the doc

Stream<List<Hero>> heroes;
// ···
void ngOnInit() async {
  heroes = _searchTerms.stream
      .transform(debounce(Duration(milliseconds: 300)))
      .distinct()
      .transform(switchMap((term) => term.isEmpty
          ? Stream<List<Hero>>.fromIterable([<Hero>[]])
          : _heroSearchService.search(term).asStream()))
      .handleError((e) {
    print(e); // for demo purposes only
  });
}

说我想在stream上触发ngOnInit()

经过一些测试,我发现可以通过致电void search(String term) => _searchTerms.add(term); 紧随其后来完成此操作:

await Future.delayed(Duration(milliseconds: 1));

似乎_searchTerms内部的ngOnInit()呼叫没有等待。

任何人都可以解释为什么这样做会如此,或者我做错了吗?

1 个答案:

答案 0 :(得分:0)

目前尚不清楚您要在这里做什么,但是一些背景可能会有所帮助。

角生命周期方法不能被中断。他们也不会等待异步操作。它们只是在角度生命周期的点将被调用的回调。不可能要求angular在某个未知点等待您完成工作。如果操作从未完成怎么办?其余子树会怎样?您将处于某种奇怪的状态,这会使许多逻辑和应用程序失效。

相反,我们使用更改检测/变量来更改组件的状态以处理这些异步操作。因此,您可以使用布尔变量显示进度指示器,直到rpc返回,然后通过翻转变量显示结果。