我有一个类似以下的程序:
+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
。这是我的代码中的错误。
答案 0 :(得分:14)
List.forEach
→ Future.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_futures和unawaited_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);
});