Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Dart's Async Stream<T> gotchas
Search
UEHARA Junji
March 29, 2018
Technology
1
160
Dart's Async Stream<T> gotchas
About Dart's async Stream and syntax sugers, async*, await for...
UEHARA Junji
March 29, 2018
Tweet
Share
More Decks by UEHARA Junji
See All by UEHARA Junji
Dart Isolate, Port and Capabilities
uehaj
5
1k
Other Decks in Technology
See All in Technology
Webアプリケーションにオブザーバビリティを実装するRust入門ガイド
nwiizo
7
890
エンジニアが主導できる組織づくり ー 製品と事業を進化させる体制へのシフト
ueokande
1
110
Codeful Serverless / 一人運用でもやり抜く力
_kensh
7
450
DroidKaigi 2025 Androidエンジニアとしてのキャリア
mhidaka
2
390
新アイテムをどう使っていくか?みんなであーだこーだ言ってみよう / 20250911-rpi-jam-tokyo
akkiesoft
0
350
スクラムガイドに載っていないスクラムのはじめかた - チームでスクラムをはじめるときに知っておきたい勘所を集めてみました! - / How to start Scrum that is not written in the Scrum Guide 2nd
takaking22
2
210
要件定義・デザインフェーズでもAIを活用して、コミュニケーションの密度を高める
kazukihayase
0
120
メルカリIBISの紹介
0gm
0
400
5分でカオスエンジニアリングを分かった気になろう
pandayumi
0
260
職種の壁を溶かして開発サイクルを高速に回す~情報透明性と職種越境から考えるAIフレンドリーな職種間連携~
daitasu
0
190
Terraformで構築する セルフサービス型データプラットフォーム / terraform-self-service-data-platform
pei0804
1
200
Modern Linux
oracle4engineer
PRO
0
160
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
6.6k
Large-scale JavaScript Application Architecture
addyosmani
513
110k
4 Signs Your Business is Dying
shpigford
184
22k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.2k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
358
30k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
9
810
Automating Front-end Workflow
addyosmani
1370
200k
A better future with KSS
kneath
239
17k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.1k
GraphQLとの向き合い方2022年版
quramy
49
14k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
How to Think Like a Performance Engineer
csswizardry
26
1.9k
Transcript
Dartの非同期ストリーム 周りをちょっと見てみる NTTςΫϊΫϩεגࣜձࣾ ্ݪ५ೋ Dart Meetup Tokyo #4 2018/3/29
ࣗݾհ ্ݪ५ೋ(@uehaj) ॴଐ: NTTςΫϊΫϩεגࣜձࣾ ͖ͳݴޠ() Groovy,Elm,Rust,Haskell,JavaScript(React/Redux/ Redux-Saga,Cordova, ReactNative), Dart [new!]
ॻ੶ ϓϩάϥϛϯάGroovy(ٕධ) Grailsపఈೖ(ᠳӭࣾ)
͡Ίʹ Dartݴޠɺྑ͍Ͱ͢Ͷ! 2013ʹࢼͯ͠Ҏདྷ5ͿΓ2 ྑ͍ͱࢥͬͨ͜ͱ ฏ໌ɺৗࣝతɺྑ͍ͱ͜ͲΓ ଞݴޠͷܦݧ͔Βྨਪ͕ޮ͖ͦ͏ ͰݟͳΕ͵ͷ͋Δ async*, await for
͢͜ͱ Dartͷؔఆٛͷम০ࢠ(async, async*, sync*) ͬͯԿ? ಛʹasync* Ͳ͏͍Θ͚Δͷ? await for Stream<T>
ؔम০ࢠ ྫ ໊শ ΧδϡΞϧͳઆ໌ म০ͳ͠ T func() {} ؔ
ී௨ͷؔ async Future<T> func() async {} ඇಉظؔ BTZODGVODUJPOT +4$ͷBTZODؔ sync* Iteratable<T> func() sync* {} ಉظδΣωϨʔλ (synchronous generators) JS/PythonͷδΣωϨʔλ async* Stream<T> func() async*{} ඇಉظδΣωϨʔλ (asynchronous generators) ???
Stream<T> is Կ? ୯Ұ ෳ ಉظ T Iterable<T> ඇಉظ Future<T>
Stream<T> • ͜͜Ͱͷ”ඇಉظ”ʮݱεϨουͰ͕औΕͳ͍ʯఔͷҙ • StreamʹෳϦεφΛొͰ͖ΔϒϩʔυΩϟετετϦʔϜ ͱɺҰ͔ͭ͠ొͰ͖ͳ͍୯ҰొετϦʔϜ͕͋Δ͕(ܕಉ ͡)ɺasync*୯ҰొετϦʔϜΛฦ͢ɻ
StreamͱIterableͷҧ͍
म০ͷޮՌ ྫ ؔͰ͑Δ return await await for yield yield* म০ͳ͠
T func() {} ✔ × × × × async Future<T> func() async {} ✔ ✔ ✔ × × sync* Iteratable<T> func() sync* {} × × × ✔ ✔ async* Stream<T> func() async*{} × ✔ ✔ ✔ ✔
async*ؔम০ࢠͱ தͰawait(for)͕͑Δ ඇಉظॲཧΛಉظॲཧͷΑ͏ʹॻ͚Δ தͰyield͕͑Δ Stream<T>Λฦ͢δΣωϨʔλ(త)ؔ StreamContorllerΛͬͨStreamੜίʔυͷγϯ λοΫεγϡΨʔ
async*Λ͏ͱ͖ yieldͰStream<T>Λ৽نʹɺ͘͠ผͷStreamΛՃ ͯ͠࡞Δ ผͷStream<T>Λyield*Ͱ݁߹͢Δ ετϦʔϜॲཧΛݟ͘͢ॻ͖͍ͨ c.f. RxDart, flutter.async.*
await forͬͯԿ? ετϦʔϜʹର͢ΔҎԼͷॲཧΛforϧʔϓΆ͘ॻ͘γϯλοΫεγϡ Ψʔ A. ཁૉճ࣮ߦ͞ΕΔΠϕϯτϋϯυϥઃఆ B. (Ωϟϯηϧ࣌Τϥʔϋϯυϥઃఆ) C. Ұ࿈ͷΠϕϯτϋϯυϥ࣮ߦ͕ྃͨ͠ͱ͖ͷඇಉظίʔϧόο
Ϋઃఆ D. Cʹ͍ͭͯawait ඍົɾෆศ ແݶετϦʔϜʹద༻͢ΔͱɺCDʹ౸ୡ͠ͳ͍ CͰͷFutureͰൃੜ͢Δඇಉظྫ֎ΛߏจతʹΩϟονͰ͖ͳ͍
await forγϯλοΫεγϡΨʔ try { await for (elem in stream) {
AAA } } catch (e) { BBB } CCC stream.listen((elem) { AAA }, onError: (e) { BBB }, onDone: () { CCC } );
await forॊೈੑ͕͍ listen()ͳΒ ແݶετϦʔϜΛѻ͑Δ listen()͕ฦ͢StreamSubscriptionΛasFeature()Ͱ FutureԽͯ͠onErrorΛϋϯυϧͰ͖Δɻ
Stream<T>Dartඪ४ϥΠϒϥϦͷͲ ͜ͰΘΕ͍ͯΔ͔ DOMΠϕϯτɺWebSocketΫϥΠΞϯτ (dart:html) ϑΝΠϧIOɺHTTP/WebSocketαʔό(dart:io) ΞΠιϨʔτؒ௨৴ʹ͏ReceivePort
Stream<T>Flutter SDKͷͲ͜ͰΘ Ε͍ͯΔ͔ StreamBuilder: Stream͔ΒWidgetΛੜ EventChannel.StreamHandler: ωΠςΟϒϞ δϡʔϧ͔ΒDartͷσʔλड৴ flutter.async.*Stream* GUIΠϕϯτॲཧStreamͰͳ͍
[※] https://medium.com/@svenasse/flutter-event-channels-89623ce6c017
·ͱΊ async*ɺStreamΛδΣωϨʔλͷΑ͏ʹॻͨ͘Ί ͷγϯλοΫεγϡΨʔͰͨ͠ Stream<T>Λཧղ͢Δඞཁ͕͋Δ ←ॏཁ
ࢀߟࢿྉ Dart Language Asynchrony Support: Phase 2 https://www.dartlang.org/articles/language/beyond- async ϓϩάϥϛϯάݴޠDartͷجૅ
https://www.cresc.co.jp/tech/java/Google_Dart/ DartLanguageGuide.pdf