Почему моя asyn c функция, которая возвращает Future <int>, ждет каждого? - PullRequest
0 голосов
/ 20 января 2020

Моя цель с помощью этой функции - вернуть целое число, представляющее все привычки, совершенные пользователем. Моя структура баз данных представляет собой набор привычек, каждая из которых имеет подколлекцию, содержащую свою историю Приведенная ниже функция использует список привычек, и, используя идентификатор привычки, получает поток истории этой привычки. Моя проблема в том, что, когда я пытаюсь просмотреть историю для каждой привычки, она останавливается на await for. Любой совет был бы оценен, я все еще пытаюсь полностью понять потоки / асинхронные функции.

Future<int> getCompleteHabits(User user, List<Habit> habits) async {
  int completed = 0;
  if(habits.isNotEmpty) {
    for(Habit habit in habits) {
      Stream<List<HabitHistory>> streamHistory = db.streamHabitHistory(user, habit.id);
      await for(var h in streamHistory){
        print(habit.title);
        print(h);
      }
      print("test");
    }
  }
  return completed;
}

Эта функция добавит к завершенной переменной, однако, так как я не могу получить доступ ко всей истории, которую мне еще предстоит сделать итак.

Эта функция выводит на консоль следующее: она не попадает в флаттер print("test").

: ложитесь в постель к 23:30

трепетание: [Экземпляр «HabitHistory», Экземпляр «HabitHistory», Экземпляр «HabitHistory», Экземпляр «HabitHistory», Экземпляр «HabitHistory»]

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Из документации о потоках :

Потоки создаются, когда в них больше нет событий, и код, принимающий события, уведомляется об этом так же, как и сейчас. уведомил, что новое событие прибывает. При чтении событий с использованием await для l oop цикл завершается, когда поток завершается.

Причина, по которой ваш l oop зависает, заключается в том, что поток еще не было закрыто. Он будет зависать до тех пор, пока поток не закроется или пока вы не выполните оператор break или return внутри l oop.

0 голосов
/ 20 января 2020

Как сказал Abion47, поток еще не закрыт, поэтому ожидание никогда не завершается. Это ждет новых событий.

Зная это, я могу использовать await streamHabitHistory(user, habit.id).first, чтобы получить список (чтобы он не ждал событий). Код ниже.

Future<int> getCompleteHabits(User user, List<Habit> habits) async {
  int completed = 0;
  if(habits.isNotEmpty) {
    for(Habit habit in habits) {
      List<HabitHistory> history = await db.streamHabitHistory(user, habit.id).first;
      for (HabitHistory h in history) {
        completed = completed + h.completed.length;
      }

    }
  }
  return completed;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...