我的计划如下:

main() async {
  ooClass = new OoClass(1);
  int val = await function1();
  print(val);
  ooClass = new OoClass(2);
  val = await function1();
  print(val);
  ooClass = new OoClass(3);
  val = await function1();
  print(val);

}

OoClass ooClass;

Future<int> function1() async {
  List list3 = await function2();
  return list3.indexOf('Ok');
}


Future<List<String>> function2() async {

  List<String> list1 = new List<String>();

  function3(Map<String, int> map1) async {
    String string1 = '';
    bool bool1 = false;
    List<String> list2 = [];
    String string2;

    function4(String string3) async {
      if (ooClass.function7(string3)) return;
      if (ooClass.function8() && !bool1) {
        bool1 = true;
        return;
      }
      string2 = await function5(string3);
      list2.add(string2);
    }

    for (String key in map1.keys) {
      await function4(key);
    }
    string1 = list2.join(', ');
    list1.add(string1);
  }

  for (Map<String, int> idxList in ooClass.function6()) {
    await function3(idxList);
  }
  return list1;
}

function5(String s1) {
  return new Future.value('Ok');
}

class OoClass {

  List<Map<String, int>> map2;
  bool bool3 = false;

  OoClass(int type) {
    switch(type) {
      case 1:
        map2 = [{'Ok':1}];
        break;
      case 2:
        map2 = [{'id': 1, 'Ok':1}];
        break;
      case 3:
        map2 = [{'foo': 1, 'Ok':1}];
        bool3 = true;
        break;
    }
  }

  List<Map<String, int>> function6() {
    return map2;
  }

  bool function7(String string9) {
    if (string9 == 'id') return true;
    return false;
  }

  bool function8() {
    return bool3;
  }
}

这段代码可以完美地工作.

相反,在我的实际环境中,当调用等待函数4(Key);时,函数2返回list1列表(空).Function4调用稍后执行,但Function2的结果丢失.

我不太理解这种行为.有没有可能是错误,或者没有使用FOR循环内部等待? 如果等待不应该在for循环中使用,我如何以另一种方式实现它?

我使用的是DART 1.22.0-dev.4,但是我也try 了旧的(和稳定的)版本,我得到了同样的结果.


我最终得到了问题,它不依赖于for循环中的await.相反,这是我的代码中的一个错误.

推荐答案

是的,在DART中,允许在for循环内使用await,并且它将按预期工作.

for (var o in objects) {
  await doSomething(o);
}

如果这就是您要找的,甚至还有await for个用于流:

await for (var event in eventStream) {
  print("Event received: $event");
}

你的例子是DartPad中的works correctly.太复杂了&;抽象调试,但至少在表面上,它应该可以工作.不过,你说这个片段在你的"真实环境"中不起作用.如果你能解释一下你的意思,也许我们能帮上忙?

额外提示:take full advantage of static analysis,尤其是await_only_futuresunawaited_futures过梁规则.这可以帮助你捕捉很多虫子.

Dart相关问答推荐

有没有办法否定IF条件中的模式大小写匹配?

在 Dart 中使用隔离优于异步的优势

如何扩展 Dart 套接字 BroadcastStream 缓冲区大小为 1024 字节?

AngularDart 可以直接路由到组件吗?

dart:js 和 js 包有什么区别?

在 Dart 中定义一个接受参数的 getter

如何使用Flutter在按钮网格中滑动(swipe)/拖动(drag) 2 个或更多按钮

错误:非抽象类InternalSelectableMathState

如何计算列表中元素的出现次数

如何将 Stream 转换为 List

在字符串中查找字母 (charAt)

使用 dart 下载文件

dart的Completer和Future?

Dart 有 int.INFINITY 吗?

dart和下划线

Dart 中的snapshot快照概念是什么?

可以在 Dart 中的抽象类中声明静态方法吗?

如何将多个 Stream 合并为更高级别的 Stream?

Dart 中的 List.shuffle()?

如何在 Dart 中调用超级构造函数?