Запустить StreamController в ngOnInit () - PullRequest
0 голосов
/ 24 октября 2018

Взяв этот пример из документа :

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 голосов
/ 13 ноября 2018

Не совсем ясно, что вы пытаетесь сделать здесь, но некоторые предпосылки, которые могут помочь.

Угловые методы жизненного цикла не могут быть прерваны.Они также не будут ждать асинхронных действий.Это просто обратные вызовы, которые будут вызываться в точке углового жизненного цикла.Просить угловой подождать, пока вы сделаете работу в какой-то неизвестной точке, невозможно.Что делать, если действие не завершено?Что происходит с остальной частью поддерева?Вы окажетесь в каком-то странном состоянии, которое сделает недействительной большую часть логики и приложения.

Вместо этого мы используем обнаружение изменений / переменные, чтобы изменить состояние компонента для обработки этих асинхронных действий.Таким образом, вы можете показать индикатор прогресса, используя булеву переменную, пока rpc не вернется, а затем показать результаты, щелкнув по переменной.

...