2016-12-29 61 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(key);被調用,function2返回list1 List(空)。功能4調用稍後執行,但功能2的結果丟失。

我不太瞭解這種行爲。它可能是一個錯誤或等待內循環不被使用? 如果await不應該在for循環中使用,我怎樣才能以另一種方式實現它?

我正在使用dart 1.22.0-dev.4,但我也嘗試過使用舊版本(和穩定版本),並且我得到了相同的結果。


我終於拿到了這個問題,並沒有在for循環依賴於await。這是我的代碼中的錯誤。

+0

'await' in'for'很好。您的代碼示例太複雜,無法進一步調查。 –

+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"); 
} 

你在DartPad例如works correctly。這是太複雜的抽象調試&,但至少在表面上,它應該工作。但是,您認爲該代碼段在您的「真實環境」中不起作用。如果你解釋了你的意思,也許我們可以提供幫助?

附加提示:take full advantage of static analysis,特別是await_only_futuresunawaited_futures linter規則。這可以幫助你捕捉許多錯誤。