2017-02-26 18 views
2

私は何らかのボット(コマンドラインアプリケーション)を書きました。私は "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ループで動作します。例。それは実際にそのコールバックの戻り値を見ていないので、あなたは、このためにforEachを使用することはできません

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

これは私が考え始めたことです。それを確認していただきありがとうございます。私は "待っている"という表現は、それを取り巻いているものに先行していると思っていたが、ああああ... – aelayeb

3

。もし彼らが未来であれば、彼らはただ失われ、待たれることはありません。

あなたはどちらかのスティーブン・アプトンのようなループが示唆されないことができ、またはあなたが操作を同時に実行したい場合には次々、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}"); 
} 
関連する問題