Дарт: убедиться, что асинхронная информация доступна, когда происходит обработка - PullRequest
0 голосов
/ 03 мая 2018

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

Однако, async вызовы могут вернуть результат не по порядку и, возможно, позже, когда объект будет создан, что приведет к ошибке.

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

Вот мой код (пока):

Future fetch() async {
    myLinks = fetchDogList();
  }

Future process() async {
    for (int i = 0; i < myLinks.length; i++) {
      await fetchInfo(myLinks[i]);
      myDogs.add(new Dog(
          name,
          type,
          age,
          color,
          gender,
          description,
          chip,
          neutered,
          humanBehaviour,
          childBehaviour,
          petBehaviour,
          sledgeMaleBehaviour,
          sledgeFemaleBehaviour,
          otherDogBehaviour,
          otherBehaviour,
          jailBreak,
          otherThings,
          foreignAdoption,
          imageLinks));
    }
  }

  Future fetchInfo(String link) {
    name = fetchDogInfo(link, labelFetchName);
    type = fetchDogInfo(link, labelFetchBreed);
    age = fetchDogInfo(link, labelFetchAge);
    color = fetchDogInfo(link, labelFetchColor);
    gender = fetchDogInfo(link, labelFetchGender);
    description = fetchDogDetails(link, labelFetchDescription);
    chip = fetchDogDetails(link, labelFetchChip);
    neutered = fetchDogDetails(link, labelFetchNeutered);
    humanBehaviour = fetchDogDetails(link, labelFetchHumanBehavior);
    childBehaviour = fetchDogDetails(link, labelFetchChildBehavior);
    petBehaviour = fetchDogDetails(link, labelFetchPetBehavior);
    sledgeMaleBehaviour = fetchDogDetails(link, labelFetchSledgeMaleBehavior);
    sledgeFemaleBehaviour =
        fetchDogDetails(link, labelFetchSledgeFemaleBehavior);
    otherDogBehaviour = fetchDogDetails(link, labelFetchOtherDogBehavior);
    otherBehaviour = fetchDogDetails(link, labelFetchOtherDogBehavior);
    jailBreak = fetchDogDetails(link, labelFetchJailbreak);
    otherThings = fetchDogDetails(link, labelFetchOtherThings);
    foreignAdoption = fetchDogDetails(link, labelFetchForeignAdoption);
    imageLinks = fetchDogImageLinks(link);
  }

  Future main() async {
    await fetch();
    await process();
  }

Если я все правильно понял, то при вызове метода main произойдет следующее:

  1. вызывается fetch (), и только после завершения
  2. вызывается process (), начинает перебирать ссылки
  3. fetchInfo () получает n-ю ссылку, а только после завершения
  4. myDogs.add создает новый объект Dog, затем
  5. fetchInfo () получает n + 1-ю ссылку

и так далее, пока не достигнет последней ссылки в myLinks.

Является ли приведенное выше действительным, или я должен реализовать дополнительные меры безопасности?

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