2016-12-29 11 views
0

は、私は次のようなプログラムを持っている:Dartで内部ループを待っていますか?

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; 
    } 
} 

このコードは完璧に動作します。

私の実際の環境では、代わりに、function4(キー)を待っています。 function2はlist1 List(空)を返します。 Function4呼び出しは後で実行されますが、function2の結果は失われます。

私はこの動作を実際に理解していません。それはバグかもしれないし、ループが使用されないために内部を待っていますか? forループをforループ内で使用しないでください。どうすれば別の方法で実装できますか?

私はダーツ1.22.0-dev.4を使用していますが、古いバージョン(安定版)でも試してみましたが、同じ結果が出ました。


私は最終的に問題を持って、それがforループでawaitには依存しませんでした。代わりに私のコードに誤りがありました。

+0

'for'の' await'は問題ありません。コード例が複雑すぎるため、さらに調査する必要があります。 –

+0

'for'の' await'がうまくいることを知りたい –

答えて

1

はい、awaitはDartのforループ内で使用でき、期待どおりに動作します。

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

そして、それはあなたが探しているものだと、でもawait forストリームのがあります:

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

あなたの例works correctly DartPadインチそれはデバッグするには複雑すぎる&しかし、少なくとも表面的に、それは動作するはずです。あなたはスニペットがあなたの "実際の環境"では動作しないと言っています。もしあなたがそれで何を意味するのかを説明すれば、私たちは助けてくれるかもしれません。

追加チップ:take full advantage of static analysis、特にawait_only_futuresおよびunawaited_futuresリンタールール。これは多くのバグを捕まえるのに役立ちます。

関連する問題