Recommended
PDF
Clean Architectureで設計してRxJSを使った話
PDF
PDF
AngularJS+TypeScript - AngularJS 1周年記念勉強会
PDF
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
PDF
JavaScriptユーティリティライブラリの紹介
PDF
PDF
ng-japan 2015 TypeScript+AngularJS 1.3
PDF
C#次世代非同期処理概観 - Task vs Reactive Extensions
PDF
ECMAScript6による関数型プログラミング
PDF
PDF
PDF
PDF
PDF
PPTX
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
PDF
PDF
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
PPTX
C# 7.2 with .NET Core 2.1
PDF
PDF
PPTX
PDF
PDF
PPTX
C# 8.0 Preview in Visual Studio 2019 (16.0)
PPTX
PDF
PDF
Javascriptのあれやこれやをまとめて説明してみる
PDF
PDF
More Related Content
PDF
Clean Architectureで設計してRxJSを使った話
PDF
PDF
AngularJS+TypeScript - AngularJS 1周年記念勉強会
PDF
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
PDF
JavaScriptユーティリティライブラリの紹介
PDF
PDF
ng-japan 2015 TypeScript+AngularJS 1.3
PDF
C#次世代非同期処理概観 - Task vs Reactive Extensions
What's hot
PDF
ECMAScript6による関数型プログラミング
PDF
PDF
PDF
PDF
PDF
PPTX
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
PDF
PDF
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
PPTX
C# 7.2 with .NET Core 2.1
PDF
PDF
PPTX
PDF
PDF
PPTX
C# 8.0 Preview in Visual Studio 2019 (16.0)
PPTX
PDF
PDF
Javascriptのあれやこれやをまとめて説明してみる
Viewers also liked
PDF
PDF
PDF
웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기
PPTX
僕はどうしてAngular2をテーマに登壇することになってしまったのか
PPTX
PPTX
Contributions of the public health administrations to the change of the parti...
PDF
PDF
อนูพันธุศาสตร์ (Molecular Genetics)
PDF
PPT
ขั้นตอนการเขียนโปรแกรมคอมพิวเตอร์
PPT
Assignment creative teams
PPT
Happiners 201503 영업방향 및 상품전략1
PDF
PPTX
PDF
PPT
Maju Galleria Holdings Sdn. Bhd
PPTX
Comparative metagenomics: quantifying similarities between environments, CMBI...
PPT
PDF
Magento Test Automation Framework
PPTX
Similar to 歌舞伎座Tech Rx会
PDF
Reactive Extensionsで非同期処理を簡単に
PPTX
PDF
PDF
PDF
Android meets RxJava - 渋谷Java#6
PDF
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
PPTX
PPTX
【Potatotips #30】RxJavaを活用する3つのユースケース
PDF
Prism + ReactiveProperty入門
PPTX
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
PDF
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
PPTX
PPTX
PDF
PPTX
Orange Cube 自社フレームワーク 2015/3
PPT
PDF
KEY
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
PDF
Androidの通信周りのコーディングについて
PDF
歌舞伎座Tech Rx会 1. 2. W H O
• name: Kaoru Shibasaki
• Twitter: @crexista
3. W H O
• name: Kaoru Shibasaki
• Twitter: @crexista
• Work at:
4. 5. 6. W H A T ’ S
• ブラウザのPushステートを使った非同期遷移
• FlashとJSでのExternalInterfaceを使った非同期通信
• 大量のAPI通信と配信サーバ等とのコネクション管理
7. 8. 9. A G E N D A
1. Why.(なぜ使ったのか)
2. Problem.(注意点は何か)
3. How.(解決策)
4. まとめ
10. W H Y
1. EventListenerではダメなのか?
2. MVVMフレームワークは?
3. その他
11. 12. 13. _result1 = null;
_result2 = null;
_apiLoader.addEventListener(onLoad);
_apiLoader.load(url);
function onLoad(event){
_result1 = event.target.data;
_apiLoader.removeEvent(onLoad);
_apiLoader.addEventListener(onNext);
_apiLoader.load(url);
}
function onNext(event) {
_result2 = event.target.data;
_apiLoader.removeEvent(onNext);
}
一般的なEventListener例 その2
APIを順番に2つ
リクエストする場合
14. _result1 = null;
_result2 = null;
_result3 = null;
_apiLoader1.addEventListener(onLoad1);
_apiLoader2.addEventListener(onLoad2);
_apiLoader1.load(url);
_apiLoader2.load(url);
function onLoad1(event){
_result1 = event.target.data;
_apiLoader.removeEvent(onLoad);
_apiLoader.addEventListener(onNext);
_apiLoader.load(url);
if (_result2 != null) onLast();
}
function onLoad2(event) {
_result2 = event.target.data;
_apiLoader.removeEvent(onNext);
if (_result1 != null) onLast();
}
function onLast() {
//_result1と_result2を使った処理・・・
}
一般的なEventListener例 その3
APIを同時に2つリクエストして
その2つの結果から新たに処理
15. 状 態 が 増 え る
コ ー ル バ ッ ク 関 数 が 値 を 返 さ な い の で
16. 17. 18. 19. 20. var mockResult = Observable.returnValue(obj);
mock(apiLoader.load).returnValue(mockResult);
var testResult = APILoader.load().map().flatMap();
assertThat(testResult, isEqual(/*期待値*/));
Mockへに切り替えてのテスト
21. 22. M V V M と は ?
from wikiped
23. 24. コ ー ド 側V I E W 側
M V V M と は ?
<tag value = “{uvm.name}">
<button click = "{uvm.updateAge}">
class UserViewModel
{
[Bindable]
private var _age
function updateAge
{
_age ++;
}
}
25. M V V M パ タ ー ン の 欠 点
• 揮発性イベントの扱いが面倒
• ViewとVMの紐付けを動的に変更できない
• Viewロジックが複雑なものに向いてない
26. 27. 28. 29. 30. 31. P R O B L E M
1. 組み込み非同期処理との組み合わせ
2. PULL型からPUSH型のStreamへの変換時
3. SubscribeとError処理
32. 33. 34. var request = apiResult.flatMap(function(result)
{
var socket = new Socket();
var obs = Observable.fromEvent(“connect”, socket);
socket.connect();
return obs
})
.map(function(event):void
{
var socket = event.target;
//なんらかの処理
});
35. var request = apiResult.flatMap(function(result)
{
var socket = new Socket();
var obs = Observable.fromEvent(“connect”, socket);
socket.connect();
return obs
})
.map(function(event):void
{
var socket = event.target;
//なんらかの処理
});
組 み 込 み ク ラ ス
36. var request = apiResult.flatMap(function(result)
{
var socket = new Socket();
var obs = Observable.fromEvent(“connect”, socket);
socket.connect();
return obs
})
.map(function(event):void
{
var socket = event.target;
//なんらかの処理
});
組 み 込 み ク ラ ス
ここでconnectしたsocketは
requestをdisposeしても
消えない
37. var request = apiResult.flatMap(function(result)
{
var socket = new Socket();
var obs = Observable.fromEvent(“connect”, socket);
socket.connect();
return obs
})
.map(function(event):void
{
var socket = event.target;
//なんらかの処理
});
組 み 込 み ク ラ ス
組み込み系の非同期処理はそのまま使えない!
38. 39. 40. 41. 42. socketRequest = Observable.create(function(observer)
{
var socket = new Socket();
var func = function(event)
{
observer.onNext(event.target);
observer.onComplete();
};
socket.addEventListener(“connect”,func);
socket.connect();
return function()
{
socket.removeEventListener(func);
if (!socket.connected) socket.close();
}
});
43. socketRequest = Observable.create(function(observer)
{
var socket = new Socket();
var func = function(event)
{
observer.onNext(event.target);
observer.onComplete();
};
socket.addEventListener(“connect”,func);
socket.connect();
return function()
{
socket.removeEventListener(func);
if (!socket.connected) socket.close();
}
});
接続完了時の
コールバック
44. socketRequest = Observable.create(function(observer)
{
var socket = new Socket();
var func = function(event)
{
observer.onNext(event.target);
observer.onComplete();
};
socket.addEventListener(“connect”,func);
socket.connect();
return function()
{
socket.removeEventListener(func);
if (!socket.connected) socket.close();
}
});
接続キャンセル時
コールバック
45. var request = apiResult.flatMap(function(result)
{
return socketRequest;
})
.map(function(event):void
{
var socket = event.target;
//なんらかの処理
});
46. 47. 48. 49. A P I リ ク エ ス ト の 結 果 を も っ て
P U S H 通 知 サ ー バ に 接 続 し た 例
50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 悪 い 例
var request =
APILoader.load(urlA).subscribe(function(result)
{
APILoader.load(result).subscribe(function()
{
//なんかの処理
});
})
ここの処理はキャンセル
できない
65. 回 避 策
var innerReq;
var request =
APILoader.load(urlA).subscribe(function(result)
{
innerReq =APILoader.load(result).subscribe(function()
{
//なんかの処理
});
})
if (innerReq) innerReq.dispose();
request.dispose();
66. 回 避 策
var innerReq;
var request =
APILoader.load(urlA).subscribe(function(result)
{
innerReq =APILoader.load(result).subscribe(function()
{
//なんかの処理
});
})
if (innerReq) innerReq.dispose();
request.dispose();
できるといえばできるが
テストが面倒に・・
67. 68. 69. 70. 71. • Error処理忘れるな & Subscribeをあまり書くな
• なのできちんとonErrorかcatchErrorしましょう
SubscribeとErrorについて
72. で も 人 間 な の で 忘 れ る よ ね
SubscribeとErrorについて
73. 74. フ レ ー ム ワ ー ク の 方 針
• 薄くつくる
• (現状の)レイヤードアーキテクチャに合わせる
• 開発者はsubscribeを「基本」書かない
• Error処理を書き忘れても最終的にcatchするように
75. 76. 映 像 の 再 生 や 切 断 と
い っ た ア プ リ と し て
の 挙 動 を 決 め る 層
ア プ リ と し て の 挙 動 を
決 め る 際 に 必 要 と な る
ビ ジ ネ ス ロ ジ ッ ク
A P P L I C A T I O N と
U I の つ な ぎ 込 み を す
る 層
77. フ レ ー ム ワ ー ク の 方 針
• Presenter層でApplicationとUIのつなぎ込む
• 開発者はつなぎ込みだけフレームワークに従う
• あとは好きに書いてくれ
78. 79. 80. 81. function run():Array
{
var arr = presenter.start();
for (var signals in arr)
{
var signal = signals[0];
var errorHandle = (signals.length==2)?
signals[1]:defaultHandle
signal.catchError(errorHandle)
.subscribe(onNext, onComplete, onError);
}
}
フレームワーク内部での処理
エラーのキャッチ漏れ防止機構
82. 83. ま と め
• 基本クラスを覚える
• Observable, Subject, Dispose, subscribeあたり
• Operatorとしては以下を覚えておくと楽
• map, flatMap, filter, zip, merge, do, return, take, takeUntil
84. ま と め
• Subscribeの扱いはルールを決めるべし
• SubscribeをなくせばSignalの流れを掴みやすくなる
85. 86. –
H T T P S : / / G I S T . G I T H U B . C O M / S T A L T Z / 8 6 8 E 7 E 9 B C 2 A 7 B 8 C
1 F 7 5 4
“Everything is a stream”