2015-11-15 95 views

回答

1

你可以用流做到這一點

import 'dart:async' show Stream, StreamController; 

main() { 
    StreamController<int> sc = new StreamController<int>(); 

    sc.stream.listen((e) => print(e)); 

    for(int i = 0; i < 10; i++) { 
    sc.add(i); 
    } 
} 

嘗試在DartPad

參見

您不能在Dart中「等待」,特別是在瀏覽器中。

Dart還有async*生成器函數可用於創建流。例如見Async/Await feature in Dart 1.8

A 「天真」 翻譯形式await for(var event in someStream)

import 'dart:async'; 

main() { 
    StreamController<int> sc = new StreamController<int>(); 

    startProcessing(sc.stream); 

    for(int i = 0; i < 10; i++) { 
    sc.add(i); 
    } 
} 

Future startProcessing(Stream stream) async { 
    StreamSubscription subscr; 
    subscr = stream.listen((value) { 
    subscr.pause(); 
    new Future.delayed(new Duration(milliseconds: 500)).then((_) { 
     print('Processed $value'); 
     subscr.resume(); 
    }); 
    }); 
    //await for(int value in stream) { 
    // await new Future.delayed(new Duration(milliseconds: 500)).then((_) { 
    // print('Processed $value'); 
    // }); 
    //} 
} 

實際實現採用不同的方法

的方式的await-for循環實現使用一個事件緩衝區(以避免重複暫停和恢復)。

https://github.com/dart-lang/sdk/issues/24956#issuecomment-157328619

+0

「指日可待」這個作品,是不是從一個可能只是裏面的等待身體和流值將被緩衝的文檔清晰。 DartPad:https://dartpad.dartlang.org/470e2e2429c3c065f5e5 如果您將其編輯爲僅包含一次處理一個值,那麼願意接受您的答案。 –

+0

當然,「等待」是更好的語法,但否則它是一樣的。 –

+0

如果它是一樣的,你將如何實現它而不使用'await for'語法?關鍵部分是,在處理完前一個值之前未處理下一個值(可能會異步執行) –