Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Future & Stream in Dart

Future & Stream in Dart

2013 Future & Stream in Dart

Tomochika Hara

July 27, 2013
Tweet

More Decks by Tomochika Hara

Other Decks in Technology

Transcript

  1. Future & Stream
    in Dart
    tomochikahara
    @zetta1985

    View Slide

  2. Agenda
    ● Future API
    ● Stream API

    View Slide

  3. Future API
    for Ansynchronous Programming

    View Slide

  4. What is a Future?
    ● 「先物」
    ○ 別名Promise。
    ○ 処理結果を必要となる時点まで保持する
    ○ 並列処理のデザインパターン
    ■ Dartでは非同期なだけで並列処理は必須でない
    ● Futureの値を決めるCompleter
    ○ Futureはあくまでも値を保持するのみ
    ○ 計算結果をFutureに与えるのがCompleter
    ● dart:io, indexed_dbなどで利用

    View Slide

  5. Future & Completer
    Completer
    Future
    Future
    Caller Callee
    Future echoToMountain(String yo_ho);
    call echoToMountain
    create
    get
    Future
    return Future
    then((reply) => catchMyEar(reply))
    complete(reply)
    Execution

    View Slide

  6. Future & Completer
    import "dart:async";
    Future echoToMountain(String yo_ho) {
    var completer = new Completer();
    new Timer(new Duration(milliseconds: 5000), () {
    completer.complete(yo_ho);
    });
    return completer.future;
    }
    void main() {
    print("before echoToMountain");
    var future = echoToMountain("YooooHooooo");
    future.then(print);
    print("after echoToMountain");
    }

    View Slide

  7. Future Example
    new File("./foo.txt").fullPath()
    .then((fullpath) {
    print("foo.txt's fullpath is $fullpath");
    })
    .catchError((e) {
    print("foo.txt is not exists.");
    });
    File IO
    (Async try-catch)
    HTTP
    Request
    (Async Process Chain)
    var uri = Uri.parse("http://tomochikahara.com");
    new HttpClient().getUrl(uri)
    .then((HttpClientRequest req){
    // prepare request
    req.headers.add("contentType", "text/html");
    return req.close();
    }).then((HttpClientResponse res) {
    res.transform(new StringDecoder()).forEach(print);
    });

    View Slide

  8. Stream API
    for sequence of any data

    View Slide

  9. What is a Stream?
    ● イベントの「流れ」
    ○ 単なる遅延リスト。
    ○ 何回も使えるFuture。
    ○ 値が発すること=イベント、と表現
    ○ Producer - Consumer Pattern
    ■ Dartでは非同期なだけで並列処理は必須でない
    ● DOM EventやByte IO、標準入力などで利用

    View Slide

  10. Stream
    What is a Stream?
    Controller
    (Sink)
    Subscription
    D C B' A' ・・・
    Transformer
    F E
    add
    listen

    View Slide

  11. Stream
    var controller = new StreamController();
    controller.add("A");
    var stream = controller.stream;
    stream.listen((str) => print(str),
    onError : (e) => print("Error"),
    onDone : () => print("Done"));
    controller.add("B");
    controller.add("C");
    controller.addError(new StateError("Illegal State"));
    controller.add("D");
    controller.close();

    View Slide

  12. Stream Subscription
    var controller = new StreamController();
    controller.add("A");
    var stream = controller.stream;
    var subscription = stream.listen((str) => print(str),
    onDone : () => print("Done"));
    subscription.onError((e) {
    subscription.cancel();
    });
    controller.add("B");
    controller.add("C");
    controller.addError(new StateError("Illegal State"));
    controller.add("D");
    controller.close();

    View Slide

  13. Stream Transformer
    var controller = new StreamController();
    var stream = controller.stream;
    var transformer = new StreamTransformer(
    handleData : (int value, EventSink sink) {
    sink.add("$value:(1)");
    sink.add("$value:(2)");
    },
    handleDone : (EventSink sink) {
    sink.add("Done!");
    }
    );
    stream.transform(transformer).forEach(print);
    for (var i = 0; i < 10; i++) {
    controller.add(i);
    }
    controller.close();

    View Slide

  14. Stream Example
    query("input#hello").onClick.listen((MouseEvent e) {
    window.alert("hello, world.");
    });
    DOM Event
    File Access StreamSubscription> subscription;
    subscription = new File('bar.txt').openRead().listen((bytes) {
    for (var b in bytes) {
    print(new String.fromCharCode(b));
    if (b == '#'.codeUnitAt(0)) {
    subscription.cancel();
    return;
    }
    }
    });

    View Slide

  15. Stream Example
    標準入力
    HTTP Server HttpServer.bind("127.0.0.1", 8080).then((HttpServer server) {
    server.listen((HttpRequest req) {
    req.response.write("This message from my server.");
    req.response.close();
    });
    });
    print("Please Input A.");
    var stream = stdin
    .transform(new StringDecoder())
    .transform(new LineTransformer());
    stream.listen((str){
    print("Your input's length : ${str.length}");
    print(str == "A" ? "Just A." : "Not A.");
    });

    View Slide