2017-02-26 103 views
2

我正在寫一些bot(命令行應用程序),我在使用「forEach」方法時遇到了異步執行的問題。 這裏是我想要做的簡化代碼:異步/等待在List.forEach()

main() async { 
    print("main start"); 
    await asyncOne(); 
    print("main end"); 
} 

asyncOne() async { 
    print("asyncOne start"); 
    [1, 2, 3].forEach(await (num) async { 
    await asyncTwo(num); 
    }); 
    print("asyncOne end"); 
} 

asyncTwo(num) async 
{ 
    print("asyncTwo #${num}"); 
} 

這裏是輸出:

main start 
asyncOne start 
asyncOne end 
main end 
asyncTwo #1 
asyncTwo #2 
asyncTwo #3 

我想要得到的是:

main start 
asyncOne start 
asyncTwo #1 
asyncTwo #2 
asyncTwo #3 
asyncOne end 
main end 

如果有人知道我在做什麼錯我會很感激。

回答

7

我不認爲用forEach方法可以達到你想要的效果。但它將與for循環一起工作。例;

asyncOne() async { 
    print("asyncOne start"); 
    for (num number in [1, 2, 3]) 
    await asyncTwo(number); 
    print("asyncOne end"); 
} 
+0

這就是我開始想的。謝謝你確認。我認爲,「等待」表達先於任何周圍它,但噢... – aelayeb

3

你不能爲這個,因爲它實際上並沒有看它的回調的返回值使用forEach。如果他們是未來,他們將會迷失而不期待。

您可以做一個循環像史蒂芬·厄普頓建議,或者您可以使用Future.wait如果你想操作同時運行,而不是一個接一個:

asyncOne() async { 
    print("asyncOne start"); 
    await Future.wait([1, 2, 3].map(asyncTwo)); 
    print("asyncOne end"); 
} 
+0

好的,謝謝你,它是有道理的! – aelayeb

0

您需要使用Future.forEach。

main() async { 
    print("main start"); 
    await asyncOne(); 
    print("main end"); 
} 

asyncOne() async { 
    print("asyncOne start"); 
    await Future.forEach([1, 2, 3], (num) async { 
    await asyncTwo(num); 
    }); 
    print("asyncOne end"); 
} 

asyncTwo(num) async 
{ 
    print("asyncTwo #${num}"); 
}