Slide 1

Slide 1 text

Future & Stream in Dart tomochikahara @zetta1985

Slide 2

Slide 2 text

Agenda ● Future API ● Stream API

Slide 3

Slide 3 text

Future API for Ansynchronous Programming

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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"); }

Slide 7

Slide 7 text

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); });

Slide 8

Slide 8 text

Stream API for sequence of any data

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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();

Slide 12

Slide 12 text

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();

Slide 13

Slide 13 text

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();

Slide 14

Slide 14 text

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; } } });

Slide 15

Slide 15 text

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."); });