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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Vinicius Baggio Fuentes
September 14, 2013
Programming
400
2
Share
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
720
Other Decks in Programming
See All in Programming
AI Assistants for YourAngular Solutions @Angular Graz, March 2026
manfredsteyer
PRO
0
140
コードレビューをしない選択 #でぃーぷらすトウキョウ
kajitack
3
1.3k
RailsのValidatesをSwift Macrosで再現してみた
hokuron
0
150
AI時代の脳疲弊と向き合う ~言語学としてのPHP~
sakuraikotone
1
1.8k
Linux Kernelの1文字のミスで 権限昇格ができた話
rqda
0
2.2k
条件判定に名前、つけてますか? #phperkaigi #c
77web
2
910
LM Linkで(非力な!)ノートPCでローカルLLM
seosoft
0
330
生成 AI 時代のスナップショットテストってやつを見せてあげますよ(α版)
ojun9
0
330
今からFlash開発できるわけないじゃん、ムリムリ! (※ムリじゃなかった!?)
arkw
0
180
Coding as Prompting Since 2025
ragingwind
0
650
テレメトリーシグナルが導くパフォーマンス最適化 / Performance Optimization Driven by Telemetry Signals
seike460
PRO
2
210
L’IA au service des devs : Anatomie d'un assistant de Code Review
toham
0
190
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
GitHub's CSS Performance
jonrohan
1032
470k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
200
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
BBQ
matthewcrist
89
10k
A designer walks into a library…
pauljervisheath
211
24k
Mind Mapping
helmedeiros
PRO
1
140
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
340
WENDY [Excerpt]
tessaabrams
9
37k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
170
Reality Check: Gamification 10 Years Later
codingconduct
0
2.1k
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