Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
For loop 在飞镖中允许循环,在里面等待?_For Loop_Dart_Async Await - Fatal编程技术网

For loop 在飞镖中允许循环,在里面等待?

For loop 在飞镖中允许循环,在里面等待?,for-loop,dart,async-await,For Loop,Dart,Async Await,我有一个类似以下的程序: 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

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

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;
  }
}
main()异步{
ooClass=新ooClass(1);
int val=等待函数1();
打印(val);
ooClass=新ooClass(2);
val=等待函数1();
打印(val);
ooClass=新ooClass(3);
val=等待函数1();
打印(val);
}
OoClass OoClass;
Future function1()异步{
List list3=等待函数2();
返回列表3.indexOf('Ok');
}
Future function2()异步{
List list1=新列表();
函数3(映射映射1)异步{
字符串string1='';
bool bool1=假;
列表2=[];
弦2;
函数4(字符串3)异步{
if(ooClass.function7(string3))返回;
if(ooClass.function8()&&&!bool1){
bool1=真;
返回;
}
string2=等待功能5(string3);
列表2.添加(字符串2);
}
for(map1.keys中的字符串键){
等待功能4(按键);
}
string1=list2.join(',');
列表1.添加(字符串1);
}
for(ooClass.function6()中的映射idxList){
等待功能3(idxList);
}
返回列表1;
}
函数5(字符串s1){
返回新的Future.value('Ok');
}
类OoClass{
列表map2;
bool bool3=false;
OoClass(int类型){
开关(类型){
案例1:
map2=[{'Ok':1}];
打破
案例2:
map2=[{'id':1,'Ok':1}];
打破
案例3:
map2=[{'foo':1'Ok':1}];
bool3=真;
打破
}
}
列表函数6(){
返回map2;
}
布尔函数7(字符串9){
if(string9=='id')返回true;
返回false;
}
bool函数8(){
返回bool3;
}
}
这段代码非常有效

在我的真实环境中,当等待函数4(键)时;调用时,函数2返回列表1列表(空)。稍后执行Function4调用,但function2的结果丢失

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

我使用的是dart 1.22.0-dev.4,但我也尝试过使用较旧(且稳定)的版本,得到了相同的结果



我终于找到了问题,它不依赖于
for
循环中的
wait
。相反,这是我代码中的一个错误

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

for (var o in objects) {
  await doSomething(o);
}
如果您正在寻找的是流,那么甚至还有
等待

await for (var event in eventStream) {
  print("Event received: $event");
}
您在DartPad中的示例。它太复杂和抽象,无法调试,但至少从表面上看,它应该可以工作。但是,您说该代码片段在您的“真实环境”中不起作用。如果你能解释一下你的意思,也许我们能帮上忙

附加提示:,尤其是和过梁规则。这可以帮助您捕获许多bug。

List.forEach
→ <代码>未来。forEach
如果您碰巧在
列表上使用
.forEach()
,则此操作将不起作用:

someList.forEach((item) async {
  await longFunc(item);
)}
您需要使用:

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

我错误地认为这适用于
列表。forEach
直到找到。

等待
中的
for
就可以了。您的代码示例太复杂,无法进一步研究。