在Dart中承认内部for循环?

时间:2016-12-29 08:36:03

标签: for-loop dart async-await

我有一个类似以下的程序:

 +1x+1x+2
5
4
3
2
1
0
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
        at java.lang.String.charAt(Unknown Source)
        at Test.main(Test.java:10)

此代码段完美无缺。

在我的真实环境中,当等待function4(key)时;调用时,function2返回list1 List(空)。 Function4调用稍后执行,但function2的结果丢失。

我真的不明白这种行为。可能是一个错误或等待内部循环不被使用? 如果await不能在for循环中使用,我怎么能以另一种方式实现呢?

我正在使用dart 1.22.0-dev.4,但我也尝试使用较旧的(和稳定的)版本,我也有同样的结果。

我终于遇到了问题,并且它不依赖于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; } } 循环中的await。这是我的代码中的错误。

3 个答案:

答案 0 :(得分:14)

List.forEachFuture.forEach

如果您碰巧在 .forEach() 上使用 List,这将不起作用:

someList.forEach((item) async {
  await longFunc(item);
)}

您需要使用:

await Future.forEach(someList, (item) async {
  await longFunc(item);
});

我错误地认为这适用于 List.forEach,直到找到 this answer

答案 1 :(得分:8)

是的,在Dart的await循环中允许for,它将按预期工作。

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

Streams甚至有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 linter规则。这可以帮助您捕获许多错误。

答案 2 :(得分:1)

这是你的答案

/// Declare a list
List<String> _list = ['a','b','c'];

// pass the list and a callback function
 await Future.forEach(_list, (str) async {
      print(str);
    });