2017-02-26 188 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}"); 
}