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
Fault Tolerant UX
Search
Dan Gebhardt
March 04, 2015
Programming
4
950
Fault Tolerant UX
Talk from EmberConf 2015.
Dan Gebhardt
March 04, 2015
Tweet
Share
More Decks by Dan Gebhardt
See All by Dan Gebhardt
An Introduction to the JSON:API Specification
dgeb
5
790
Worker power!
dgeb
0
480
Modern Ember
dgeb
0
150
The Future of Data in Ember
dgeb
0
450
Give Apps Online Superpowers by Optimizing them for Offline
dgeb
2
210
Overview of Orbit.js
dgeb
0
110
Introducing Ember Engines
dgeb
4
3.6k
Introducing JSON API
dgeb
5
720
Ambitious Data Flows with Ember.js and Orbit.js
dgeb
10
1.6k
Other Decks in Programming
See All in Programming
「10分以内に機能を消せる状態」 の実現のためにやっていること
togishima
1
260
Claude Code on the Web を超える!? Codex Cloud の実践テク5選
sunagaku
0
470
詳細の決定を遅らせつつ実装を早くする
shimabox
1
990
Vue 3.6 時代のリアクティビティ最前線 〜Vapor/alien-signals の実践とパフォーマンス最適化〜
hiranuma
2
430
ネストしたdata classの面倒な更新にさようなら!Lensを作って理解するArrowのOpticsの世界
shiita0903
1
290
AI時代に必須!状況言語化スキル / ai-context-verbalization
minodriven
3
370
業務でAIを使いたい話
hnw
0
260
Register is more than clipboard
satorunooshie
1
450
歴史から学ぶ「Why PHP?」 PHPを書く理由を改めて理解する / Learning from History: “Why PHP?” Rediscovering the Reasons for Writing PHP
seike460
PRO
0
140
PyCon mini 東海 2025「個人ではじめるマルチAIエージェント入門 〜LangChain × LangGraphでアイデアを形にするステップ〜」
komofr
3
910
KoogではじめるAIエージェント開発
hiroaki404
1
420
FlutterKaigi 2025 システム裏側
yumnumm
0
710
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
3.5k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
192
56k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
Git: the NoSQL Database
bkeepers
PRO
432
66k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
Mobile First: as difficult as doing things right
swwweet
225
10k
Facilitating Awesome Meetings
lara
57
6.6k
A better future with KSS
kneath
239
18k
Designing Experiences People Love
moore
142
24k
Transcript
FA U LT T O L E R A N
T U X D A N G E B H A R D T @ d g e b
None
None
& > < > a > z in r O
m D > 30 3
None
None
None
None
None
None
None
None
None
None
None
None
<html /> J AVA S C R I P T
None
None
None
< M A R K U P / >
None
None
None
None
FA U LT T O L E R A N
C E U X F I R S T
FA U LT T O L E R A N
T U X = = T R A N S A C T I O N A L U X
T R A N S A C T I O
N A L U X • Atomic • Consistent • Isolated • Durable
AT O M I C “ A L L O
R N O T H I N G ”
None
C O N S I S T E N T
M O V E S B E T W E E N VA L I D S TAT E S
None
None
I S O L AT E D A L L
O W S C O N C U R R E N T C H A N G E S
None
D U R A B L E C H A
N G E S P E R S I S T
None
A p p l i c a t i o
n s M U S T N O T V i o l a t e t h e R u l e s o f Tr a n s a c t i o n a l U X O R E L S E
FA U LT T O L E R A N
T U X = = F O R G I V I N G U X
A p p l i c a t i o
n s S H O U L D Tr y t o P ro v i d e a F o rg i v i n g U X ~ p l e a s e ~
T R A N S I T I O N
A L P E R S I S T E N C E
None
U N D O / R E D O
None
O F F L I N E S U P
P O RT
[ Offline ] Ember ToDos
A S Y N C H R O N O
U S ( N O N - B L O C K I N G ) I N T E R FA C E
Syncing… Ember ToDos
E N G I N E E R I N
G FA U LT T O L E R A N C E
E M B E R P R O V I
D E S S I M P L E , E L E G A N T PAT T E R N S F O R B U I L D I N G A C O N S I S T E N T U X
E M B E R D ATA P R O
V I D E S S I M P L E , E L E G A N T PAT T E R N S F O R B U I L D I N G A C O N S I S T E N T + D U R A B L E U X
E M B E R D ATA Atomic Consistent Isolated
Durable = R E Q U I R E S C U S T O M I Z AT I O N Transitional Persistence Undo / Redo Offline Support Asynchronous Interfaces
R E T H I N K A S S
U M P T I O N S A N D P R I M I T I V E S
DISPARATE SOURCES
DISPARATE DATA
COMMON INTERFACES
NORMALIZED DATA
EVENTED CONNECTIONS
PROMISIFIED METHODS doThing
A S TA N D A L O N E
L I B R A RY F O R C O O R D I N AT I N G A C C E S S T O D ATA S O U R C E S A N D K E E P I N G T H E I R C O N T E N T S S Y N C H R O N I Z E D .
PRIMARY INTERFACES { } REQUESTABLE TRANSFORMABLE
REQUESTABLE find add remove update patch findLink addLink removeLink findLinked
TRANSFORMABLE transform(operation)
NORMALIZED DATA JSON Patch transformations: [{"op":"remove",! "path":["planet","f82eed41-3e63-4061-953f-23f74192dcdd"]}! {"op":"add",! "path":["planet","107dc357-7df5-422f-b9d7-817244716e86"],! “value”:{“name”:”Mercury",!
"id":"107dc357-7df5-422f-b9d7-817244716e86"}}]!
CONNECTORS { } REQUEST TRANSFORM
SYNCHRONOUS EVENT HANDLING 1 2 3 4 5 6
1 2 3 4 5 6 7 ??? P P
= Promise SYNCHRONOUS EVENT HANDLING
PROMISE-AWARE EVENTS 1 2 3 4 5 6 7 8
P P P P P = Promise Async Blocking
PROMISE-AWARE EVENTS 1 2 3 ??? 4 5 6 7
P = Promise P P Async Non-Blocking
COMMON LIBRARY
{ } MEMORY JSON API LOCAL STORAGE + MORE +
ORBIT COMMON LIB SOURCES
{ } MODELS KEYS RELATIONSHIPS + MORE + ORBIT COMMON
LIB SCHEMA
+ = ember-orbit
EO.Store all filter retrieve ! find add remove patch findLink
addLink removeLink { } { } Synchronous Asynchronous ember-orbit
Star = EO.Model.extend({! name: attr('string'),! planets: hasMany('planet', {inverse: 'sun'})! });!
! Planet = EO.Model.extend({! name: attr('string'),! classification: attr('string'),! sun: hasOne('star', {inverse: 'planets'})! }); EO.Model ember-orbit
URLS DRIVE APPLICATION STATE
SOURCES DRIVE MODEL STATE ember-orbit
A P P L I C AT I O N
PAT T E R N S
CLIENT-FIRST DEVELOPMENT
PLUGGABLE SOURCES
DATA SYNCHRONIZATION
EDITING CONTEXTS
UNDO / REDO
Twitter: @orbitjs IRC: #orbitjs Github: https://github.com/orbitjs Soon: orbitjs.com
T H A N K S ! @ d g
e b