Dart:确保处理发生时可以使用异步信息

时间:2018-05-03 06:34:33

标签: dart

目前,无论何时需要显示数据,我的应用都会在现场提取数据。但是,这确实存在一些延迟和移动数据使用,所以我想构建一个初始化类,它在应用程序启动时执行一次性数据提取,并在整个生命周期中使用它。

但是,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. 时调用
  3. 调用process(),开始迭代链接
  4. fetchInfo()接收第n个链接,仅在完成时
  5. myDogs.add创建一个新的Dog对象,然后
  6. fetchInfo()接收第n + 1个链接
  7. 依此类推,直到它到达myLinks中的最后一个链接。

    以上是否有效,还是应该实施进一步的保护措施?

0 个答案:

没有答案