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
JavaScript Assíncrono
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Vinicius Baggio Fuentes
September 14, 2013
Programming
400
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
JavaScript Assíncrono
Palestra sobre javascript usando promises.
Vinicius Baggio Fuentes
September 14, 2013
More Decks by Vinicius Baggio Fuentes
See All by Vinicius Baggio Fuentes
Programação funcional para fazer Ruby melhor
vinibaggio
1
730
Other Decks in Programming
See All in Programming
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.5k
How I Won Prize Money at a Hackathon Using Codex and Symphony Alpha
yasei_no_otoko
0
130
進化を続けるGo toolsの現在地 / The Current State of Ever-Evolving Go Tools
hond0413
0
280
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
170
まだ間に合う!今年の夏こそSchemeのマクロ展開器を完全理解!
omasanori
0
580
信頼性の目標を誰も求めてない
shubox
0
400
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
690
Go 1.27 における memory allocation の高速化
andpad
0
350
My Marp Sample
sinoue0108
0
130
ハーネス設計入門 〜プロンプト、コンテキストの次〜
kinopeee
44
28k
FastAPI の並行処理モデルを完全に理解する
hoto17296
9
3.3k
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
170
Featured
See All Featured
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
480
4 Signs Your Business is Dying
shpigford
187
23k
We Have a Design System, Now What?
morganepeng
55
8.3k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
220
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
660
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Darren the Foodie - Storyboard
khoart
PRO
3
3.8k
How GitHub (no longer) Works
holman
316
150k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
460
Transcript
JavaScript assíncrono then Vinícius Baggio Fuentes Wednesday, September 18, 13
Words Matter Wednesday, September 18, 13
Wednesday, September 18, 13
User profile Wednesday, September 18, 13
User profile Post data Wednesday, September 18, 13
User profile Post data Notes Wednesday, September 18, 13
User profile Post data Notes read later collection collab Wednesday,
September 18, 13
read next recommended rec. stats further reading Wednesday, September 18,
13
várias formas de resolver • SQL Joins absurdos • Denormalização*
dos dados • Materialized Views (???) • Buscar em etapa (pipeline) * Tradução tosca!! Wednesday, September 18, 13
Denormalização + Pipeline* * Esta é apenas uma simulação inventada
e qualquer semelhança com a realidade é um mero acidente. Post + Anotações + Further reading Perfil, foto etc Recomendações + stats Read next Compõe e serve Wednesday, September 18, 13
fetchPostData(id, function (err, post) { fetchProfileData(post.profileId, function (err, profile) {
fetchRecommendation(id, function (err, recStats) { fetchReadNext(id, function (err, readNext) { render({ post: renderPartial(post), profile: renderPartial(profile), recStats: renderPartial(recStats), readNext: renderPartial(readNext), }) }) }) }) }) Wednesday, September 18, 13
fetchPostData(id, function (err, post) { fetchProfileData(post.profileId, function (err, profile) {
fetchRecommendation(id, function (err, recStats) { fetchReadNext(id, function (err, readNext) { render({ post: renderPartial(post), profile: renderPartial(profile), recStats: renderPartial(recStats), readNext: renderPartial(readNext), }) }) }) }) }) LOL NODE Wednesday, September 18, 13
fetchPostData(id, function (err, post) { fetchProfileData(post.profileId, function (err, profile) {
fetchRecommendation(id, function (err, recStats) { fetchReadNext(id, function (err, readNext) { render({ post: renderPartial(post), profile: renderPartial(profile), recStats: renderPartial(recStats), readNext: renderPartial(readNext), }) }) }) }) }) Wednesday, September 18, 13
Post + Anotações + Further reading Perfil, foto etc Recomendações
+ stats Read next Renderiza e serve Denormalização + Pipeline + concorrência Wednesday, September 18, 13
var data = {} fetchPostData(id, function (err, post) { data.post
= post fetchProfileData(post.profileId, function (err, profile) { data.profile = renderPartial(profile) }) fetchRecommendation(id, function (err, recStats) { data.recStats = renderPartial(recStats) }) fetchReadNext(id, function (err, readNext) { data.readNext = renderPartial(readNext) }) }) process.nextTick(function tryRenderData () { if (data.post && data.profile && data.recStats && data.readNext) { render(data) } else { process.nextTick(tryRenderData) } }) Wednesday, September 18, 13
Futures Wednesday, September 18, 13
var id = '7c95f3526713' var post = future(fetchPostData, id) var
recStats = future(fetchRecommendation, id) var readNext = future(fetchReadNext, id) var profile = future(fetchProfileData, post.realize().profileId) var postPartial = future(renderPartial, post) var recStatsPartial = future(renderPartial, recStats) var readNextPartial = future(renderPartial, readNext) var profilePartial = future(renderPartial, profile) render({ post: postPartial.realize(), recStats: recStatsPartial.realize(), profile: profilePartial.realize(), readNext: profilePartial.realize(), }) Wednesday, September 18, 13
future() realize() Wednesday, September 18, 13
var id = '7c95f3526713' var post = future(fetchPostData, id) var
recStats = future(fetchRecommendation, id) var readNext = future(fetchReadNext, id) var profile = future(fetchProfileData, post.realize().profileId) var postPartial = future(renderPartial, post) var recStatsPartial = future(renderPartial, recStats) var readNextPartial = future(renderPartial, readNext) var profilePartial = future(renderPartial, profile) render({ post: postPartial.realize(), recStats: recStatsPartial.realize(), profile: profilePartial.realize(), readNext: profilePartial.realize(), }) Cenário A: função demora a retornar retorna rápido { t realize() bloqueia retorna rápido { realize() bloqueia Wednesday, September 18, 13
var id = '7c95f3526713' var post = future(fetchPostData, id) var
recStats = future(fetchRecommendation, id) var readNext = future(fetchReadNext, id) var profile = future(fetchProfileData, post.realize().profileId) var postPartial = future(renderPartial, post) var recStatsPartial = future(renderPartial, recStats) var readNextPartial = future(renderPartial, readNext) var profilePartial = future(renderPartial, profile) render({ post: postPartial.realize(), recStats: recStatsPartial.realize(), profile: profilePartial.realize(), readNext: profilePartial.realize(), }) Cenário B: função executa rápido retorna rápido { t realize() retorna rápido retorna rápido { realize() retorna rápido Wednesday, September 18, 13
Promises Wednesday, September 18, 13
var id = '7c95f3526713' var postPromise = fcall(fetchPostData, id) var
recStatsPromise = fcall(fetchRecommendation, id).then(renderPartial) var readNextPromise = fcall(fetchReadNext, id).then(renderPartial) var postPartialPromise = postPromise.then(renderPartial) var profilePromise = postPromise.then(function (post) { return fcall(fetchProfileData, post.profileId) }) all(postPartialPromise, recStatsPromise, readNextPromise, profilePromise) .then(function (postPartial, recStatsPartial, readNextPartial, profilePartial) { render({ post: postPartial, recStats: recStatsPartial, profile: profilePartial, readNext: profilePartial, }) }) Wednesday, September 18, 13
var id = '7c95f3526713' var postPromise = fetchPostData(id) var recStatsPromise
= fetchRecommendation(id).then(renderPartial) var readNextPromise = fetchReadNext(id).then(renderPartial) var postPartialPromise = postPromise.then(renderPartial) var profilePromise = postPromise.then(function (post) { return fetchProfileData(post.profileId) }) all(postPartialPromise, recStatsPromise, readNextPromise, profilePromise) .then(function (postPartial, recStatsPartial, readNextPartial, profilePartial) { render({ post: postPartial, recStats: recStatsPartial, profile: profilePartial, readNext: profilePartial, }) }) Wednesday, September 18, 13
Grandes sistemas que usam programação funcional tendem a parecer como
uma montadora de automóveis Wednesday, September 18, 13
function createPost(req, res) { reqFormData(req, 'post') .then(validateNewPost) .then(createPost) .then(function (post)
{ res.render('posts.show', {post: post}) }) .fail(function (error) { res.render422('posts.new', error) }) } Wednesday, September 18, 13
function createPost(req, res) { reqFormData(req, 'post') .then(validateNewPost) .then(createPost) .then(function (post)
{ res.render('posts.show', {post: post}) }) .fail(function (error) { res.render422('posts.new', error) }) } function validatePost(formData) { return Q.all( _validateTitle(formData), _validateBody(formData) ).then(function () { return formData }) } Wednesday, September 18, 13
function createPost(req, res) { reqFormData(req, 'post') .then(validateNewPost) .then(createPost) .then(function (post)
{ res.render('posts.show', {post: post}) }) .fail(function (error) { res.render422('posts.new', error) }) } MONADS! function validatePost(formData) { return Q.all( _validateTitle(formData), _validateBody(formData) ).then(function () { return formData }) } Wednesday, September 18, 13
ƒ wrap unwrap ƒ ƒ Wednesday, September 18, 13
Q • Promises/A+ • converter node.js-style callbacks p/ promises •
all/spread, progress noti cation Wednesday, September 18, 13
Q + _ + js = functional programming pro-style Wednesday,
September 18, 13
Functional JavaScript Wednesday, September 18, 13
Perguntas? Wednesday, September 18, 13
Créditos de imagens: http://www.flickr.com/photos/thomashawk/292253202 Wednesday, September 18, 13