SlideShare a Scribd company logo
THE EVOLUTION OF
ASYNCHRONOUS
JAVASCRIPT
@cirpo
Tech Lead/Coach @
@cirpo
ASYNCHRONY
ASYNC
IS
HARD
every time you use
setTimeout()
in a test
a unicorn dies
ASYNC
IS
HARD
SAD PANDA
SEQUENTIAL BRAIN
SEQUENTIAL BRAIN
Put aside involuntary,
subconscious,
automatic
brain functions
we are not multitasker!
❤
“Always bet on JavaScript”
Brendan Eich
“any application that can be written
in JavaScript, 
will eventually be written
in JavaScript”
Jeff Atwood
JAVASCRIPT
IS NON-BLOCKING
events
eventloop
net
filesystem
…
event queue thread pool
JS IS NON-BLOCKING
JS unlike a lot of other languages
never blocks
handling I/O is typically performed
via events and callbacks
JS unlike a lot of other languages
never blocks
handling I/O is typically performed
via events and callbacks
//cart
loadUserInfo()
loadCartItems()
retrieveExchangeRates()
calculateTotal()
JS unlike a lot of other languages
never blocks
handling I/O is typically performed
via events and callbacks
function getTotal() {
let total = 0
try {
const userInfo = loadUserInfo()
const cartItems = loadCartItems()
const exr = retrieveExchangeRates()
total = calculateTotal(userInfo, cartItems, exr)
} catch (error) {
}
return total
}
JS unlike a lot of other languages
never blocks
handling I/O is typically performed
via events and callbacks
function getTotal() {
let total = 0
try {
const userInfo = loadUserInfo()
const cartItems = loadCartItems()
const exr = retrieveExchangeRates()
total = calculateTotal(userInfo, cartItems, exr)
} catch (error) {
}
return total
}
can we do this?
JS unlike a lot of other languages
never blocks
handling I/O is typically performed
via events and callbacks
function getTotal() {
let total = 0
try {
const userInfo = loadUserInfo()
const cartItems = loadCartItems()
const exr = retrieveExchangeRates()
total = calculateTotal(userInfo, cartItems, exr)
} catch (error) {
}
return total
}
we could but…..
we are blocking!
JS unlike a lot of other languages
never blocks
handling I/O is typically performed
via events and callbacks
function getTotal() {
let total = 0
try {
const userInfo = loadUserInfo()
const cartItems = loadCartItems()
const exr = retrieveExchangeRates()
total = calculateTotal(userInfo, cartItems, exr)
} catch (error) {
}
return total
}
we have to “wait”
what if waiting
was easy as
blocking
ASYNCRONY
callback
promise
async/await
HOW DID WE
GET THERE?
WHY DID WE
GET THERE?
what if waiting
was easy as
blocking
block
=
pull
const userInfo = loadUserInfo()
const cartItems = loadCartItems()
const exchangeRates = retrieveExchangeRates()
BLOCKING = PULL
block
=
pull
CALLBACK
CALLBACK
//cart
loadUserInfo(function(){
loadCartItems()
retrieveExchangeRates()
calculateTotal()
})
CALLBACK
//cart
loadUserInfo(function(){
loadCartItems(function(){
retrieveExchangeRates()
calculateTotal()
})
})
CALLBACK
//cart
loadUserInfo(function(){
loadCartItems(function(){
retrieveExchangeRates(function(){
calculateTotal(function(){
})
})
})
})
CALLBACK
//cart
loadUserInfo(function(){
loadCartItems(function(){
retrieveExchangeRates(function(){
calculateTotal(function(){
})
})
})
})
CALLBACK
//cart
loadUserInfo(function(){
loadCartItems(function(){
retrieveExchangeRates(function(){
calculateTotal(function(){
})
})
})
})
sometimes
we are just
lazy
CALLBACK
const fs = require('fs')
const file = './todo.txt'
fs.readFile(file, 'utf8', function(err, todoList) {
if (err) return console.log(err)
todoList = todoList + 'n watch GOT'
fs.writeFile(file, todoList, function(err) {
if(err) return console.log(err)
console.log('todo added!')
})
})
CALLBACK
const fs = require('fs')
const file = './todo.txt'
fs.readFile(file, 'utf8', addTodo)
function notify(err) {
if(err) return console.log(err)
console.log(‘todo added!')
}
function addTodo(err, todoList) {
if (err) return console.log(err)
todoList = todoList + 'n watch GOT’
fs.writeFile(file, todoList, notify)
}
wait
=
push
CALLBACK
const fs = require('fs')
const file = './todo.txt'
fs.readFile(file, 'utf8', addTodo)
function notify(err) {
if(err) return console.log(err)
console.log(‘todo added!')
}
function addTodo(err, todoList) {
if (err) return console.log(err)
todoList = todoList + 'n watch GOT’
fs.writeFile(file, todoList, notify)
}
LOSS OF
ERROR HANDLING
CALLBACK
const fs = require('fs')
const file = './todo.txt'
fs.readFile(file, 'utf8', addTodo)
function notify(err) {
if(err) return console.log(err)
console.log(‘todo added!')
}
function addTodo(err, todoList) {
if (err) return console.log(err)
todoList = todoList + 'n watch GOT’
fs.writeFile(file, todoList, notify)
}
INVERSION OF
CONTROL
“Don't call us, we'll call you”
CALLBACK
//cart
loadUserInfo(function(){
loadCartItems(function(){
retrieveExchangeRates(function(){
calculateTotal(function(){
})
})
})
})
CALLBACK
what if it’s never called?
what if it’s called more then once?
what if it’s called too early?
HOW CAN YOU TELL
IF IT’S AN ASYNC
CALLBACK?
READ THE SOURCE LUKE!
I ❤ CALLBACK
Callbacks are the fundamental unit
of asynchrony in JS
But sometimes they’re not enough
for the evolving landscape
of async programming as JS matures
what if waiting
was easy as
blocking
JS unlike a lot of other languages
never blocks
handling I/O is typically performed
via events and callbacks
function getTotal() {
let total = 0
try {
const userInfo = loadUserInfo()
const cartItems = loadCartItems()
const exr = retrieveExchangeRates()
total = calculateTotal(userInfo, cartItems, exr)
} catch (error) {
}
return total
}
PROMISE
PROMISE
This lets asynchronous methods return
values like synchronous methods
instead of the final value
we get a promise.
A promise represents a proxy for a value
not necessarily known
when the promise is created
Up until ES2015/ES6,
JS itself has actually
never had any direct notion of
asynchrony built into it
PROMISE
JS runs inside a hosting environment
(the browser/nodejs)
The event loop is handled by it
PROMISE
PROMISE
http://ecma-international.org/ecma-262/6.0/#sec-jobs-and-job-queues
PROMISE
//cart
function loadUserInfo() {
return new Promise((resolve, reject) => {
fetch(url, (err, userInf) => {
if (err) return reject(err)
return resolve(userInfo)
})
})
}
PROMISE
//cart
loadUserInfo()
.then(loadCartItems)
.then(retrieveExchangeRates)
.then(calculateTotal)
.catch((err) => {})
PROMISE
control flow
PROMISE
control flow
PROMISE
inversion of control
control flow
PROMISE
inversion of control
control flow
PROMISE
inversion of control
error handling
control flow
PROMISE
inversion of control
error handling
control flow
PROMISE
inversion of control
async or sync?
error handling
control flow
PROMISE
inversion of control
async or sync?
error handling
control flow
WIN!
BUT…..
PROMISE
loadMovieMetaData().then((data) => {
return parse(data).then((data) => {
return save(data)
})
})
PROMISE
loadMovieMetaData()
.then((data) => {
return parse(data)
})
.then((data) => {
return save(data)
})
PROMISE
loadMovieMetaData()
.then(parse)
.then(save)
.catch(...)
DON’T USE
PROMISE
FOR CONTROL FLOW
YOUR CODEBASE THEN
BECOMES
PROMISE DEPENDANT
TO PROMISE
OR
TO CALLBACK?
IF YOU HAVE A
LIBRARY, SUPPORT
BOTH
function foo(x, y, cb) {
return new Promise((resolve, reject) =>
fetch(url, (err, data) => {
if(err){
if(cb) cb(err)
return reject(err)
}
if(cb) cb(null, data)
return resolve(data)
}))
}
SINGLE VALUE
SINGLE RESOLUTION

IS NOT GOOD
FOR STREAMS
PERFORMANCE?
PERFORMANCE?
JS unlike a lot of other languages
never blocks
handling I/O is typically performed
via events and callbacks
function getTotal() {
let total = 0
try {
const userInfo = loadUserInfo()
const cartItems = loadCartItems()
const exr = retrieveExchangeRates()
total = calculateTotal(userInfo, cartItems, exr)
} catch (error) {
}
return total
}
GENERATOR
GENERATOR
a new type of function
that does’t not behave with the
run-to-completion behaviour
GENERATOR
function *foo(){
let x = 1
yield
return x
}
GENERATOR
function *foo(){
let x = 1
yield
return x
}
const g = foo()
let n = g.next()
console.log(n)
// {value: undefined, done: false}
n = g.next()
console.log(n)
// {value: 1, done: true}
GENERATOR
function *foo(){
let x = 1
yield
return x
}
const g = foo()
let n = g.next()
console.log(n)
// {value: undefined, done: false}
n = g.next()
console.log(n)
// {value: 1, done: true}
GENERATOR
function *foo(){
let x = 1
yield
return x
}
const g = foo()
let n = g.next()
console.log(n)
// {value: undefined, done: false}
n = g.next()
console.log(n)
// {value: 1, done: true}
GENERATOR
function *foo(){
let x = 1
yield
return x
}
const g = foo()
let n = g.next()
console.log(n)
// {value: undefined, done: false}
n = g.next()
console.log(n)
// {value: 1, done: true}
with yield
we are
pausing
A.K.A “BLOCKING””
GENERATOR
iterator is just one side
GENERATOR
the other side is an “observable”
GENERATOR
function *bar(){
let x = 14
let y = yield * x
return y
}
GENERATOR
function *bar(){
let x = 14
let y = yield * x
return y
}
GENERATOR
function *bar(){
let x = 14
let y = yield * x
return y
}
const g = bar()
let n = g.next()
console.log(n)
//{value: undefined, done: false}
n = g.next(3)
console.log(n)
//{value: 42, done: true}
function *bar(){
let x = 14
let y = yield * x
return y
}
GENERATOR
const g = bar()
let n = g.next()
console.log(n)
//{value: undefined, done: false}
n = g.next(3)
console.log(n)
//{value: 42, done: true}
function *bar(){
let x = 14
let y = yield * x
return y
}
GENERATOR
const g = bar()
let n = g.next()
console.log(n)
//{value: undefined, done: false}
n = g.next(3)
console.log(n)
//{value: 42, done: true}
function *bar(){
let x = 14
let y = yield * x
return y
}
GENERATOR
const g = bar()
let n = g.next()
console.log(n)
//{value: undefined, done: false}
n = g.next(3)
console.log(n)
//{value: 42, done: true}
we are pulling
we are pushing
what if waiting
was easy as
blocking
GENERATOR + PROMISE
the iterator should listen for the promise to
resolve (or reject)
then either resume the generator with the
fulfilment message
or throw an error into the generator with
the rejection reason)
GENERATOR + PROMISE
function *getTotal() {
let total = 0
try {
const userInfo = yield loadUserInfo()
const cartItems = yield loadCartItems()
const exr = yield retrieveExchangeRates()
total = calculateTotal(userInfo, cartItems, exr)
} catch (error) {
}
return total
}
GENERATOR + PROMISE
npm install co
GENERATOR + PROMISE
co(getTotal)
ASYNC/AWAIT
ASYNC/AWAIT
async function getTotal() {
let total = 0
try {
const userInfo = await loadUserInfo()
const cartItems = await loadCartItems()
const exr = await retrieveExchangeRates()
total = calculateTotal(userInfo, cartItems, exr)
} catch (error) {
}
return total
}
JS unlike a lot of other languages
never blocks
handling I/O is typically performed
via events and callbacks
function getTotal() {
let total = 0
try {
const userInfo = loadUserInfo()
const cartItems = loadCartItems()
const exr = retrieveExchangeRates()
total = calculateTotal(userInfo, cartItems, exr)
} catch (error) {
}
return total
}
is async/await
the answer to all
our async issues?
CHOOSE
YOUR
WAY
“Any fool can write code that a computer can
understand.
Good programmers write code that humans can
understand.”
Martin Fowler
Kyle Simpson @getify
github.com/getify/You-Dont-Know-JS
@cirpo
THANK YOU!

More Related Content

What's hot

History of jQuery
History of jQueryHistory of jQuery
History of jQuery
jeresig
 
Deferred
DeferredDeferred
Deferred
daiying-zhang
 
UI 모듈화로 워라밸 지키기
UI 모듈화로 워라밸 지키기UI 모듈화로 워라밸 지키기
UI 모듈화로 워라밸 지키기
NAVER SHOPPING
 
Redux Sagas - React Alicante
Redux Sagas - React AlicanteRedux Sagas - React Alicante
Redux Sagas - React Alicante
Ignacio Martín
 
The Beauty Of Java Script V5a
The Beauty Of Java Script V5aThe Beauty Of Java Script V5a
The Beauty Of Java Script V5arajivmordani
 
JavaScript and the AST
JavaScript and the ASTJavaScript and the AST
JavaScript and the AST
Jarrod Overson
 
Get started with YUI
Get started with YUIGet started with YUI
Get started with YUIAdam Lu
 
ES2015 workflows
ES2015 workflowsES2015 workflows
ES2015 workflows
Jarrod Overson
 
The Beauty of Java Script
The Beauty of Java ScriptThe Beauty of Java Script
The Beauty of Java Script
Michael Girouard
 
meet.js - QooXDoo
meet.js - QooXDoomeet.js - QooXDoo
meet.js - QooXDoo
Radek Benkel
 
The evolution of redux action creators
The evolution of redux action creatorsThe evolution of redux action creators
The evolution of redux action creators
George Bukhanov
 
The redux saga begins
The redux saga beginsThe redux saga begins
The redux saga begins
Daniel Franz
 
Rxjs kyivjs 2015
Rxjs kyivjs 2015Rxjs kyivjs 2015
Rxjs kyivjs 2015
Alexander Mostovenko
 
Redux saga: managing your side effects. Also: generators in es6
Redux saga: managing your side effects. Also: generators in es6Redux saga: managing your side effects. Also: generators in es6
Redux saga: managing your side effects. Also: generators in es6
Ignacio Martín
 
Intro to Reactive Programming with Swift
Intro to Reactive Programming with SwiftIntro to Reactive Programming with Swift
Intro to Reactive Programming with Swift
xw92
 
Developing iOS apps with Swift
Developing iOS apps with SwiftDeveloping iOS apps with Swift
Developing iOS apps with Swift
New Generation Applications
 
Standford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCs
Standford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCsStandford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCs
Standford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCs
彼得潘 Pan
 
rx.js make async programming simpler
rx.js make async programming simplerrx.js make async programming simpler
rx.js make async programming simplerAlexander Mostovenko
 
Standford 2015 week3: Objective-C Compatibility, Property List, Views
Standford 2015 week3: Objective-C Compatibility, Property List, ViewsStandford 2015 week3: Objective-C Compatibility, Property List, Views
Standford 2015 week3: Objective-C Compatibility, Property List, Views
彼得潘 Pan
 
FrontendLab: Programming UI with FRP and Bacon js - Вячеслав Ворончук
FrontendLab: Programming UI with FRP and Bacon js - Вячеслав ВорончукFrontendLab: Programming UI with FRP and Bacon js - Вячеслав Ворончук
FrontendLab: Programming UI with FRP and Bacon js - Вячеслав ВорончукGeeksLab Odessa
 

What's hot (20)

History of jQuery
History of jQueryHistory of jQuery
History of jQuery
 
Deferred
DeferredDeferred
Deferred
 
UI 모듈화로 워라밸 지키기
UI 모듈화로 워라밸 지키기UI 모듈화로 워라밸 지키기
UI 모듈화로 워라밸 지키기
 
Redux Sagas - React Alicante
Redux Sagas - React AlicanteRedux Sagas - React Alicante
Redux Sagas - React Alicante
 
The Beauty Of Java Script V5a
The Beauty Of Java Script V5aThe Beauty Of Java Script V5a
The Beauty Of Java Script V5a
 
JavaScript and the AST
JavaScript and the ASTJavaScript and the AST
JavaScript and the AST
 
Get started with YUI
Get started with YUIGet started with YUI
Get started with YUI
 
ES2015 workflows
ES2015 workflowsES2015 workflows
ES2015 workflows
 
The Beauty of Java Script
The Beauty of Java ScriptThe Beauty of Java Script
The Beauty of Java Script
 
meet.js - QooXDoo
meet.js - QooXDoomeet.js - QooXDoo
meet.js - QooXDoo
 
The evolution of redux action creators
The evolution of redux action creatorsThe evolution of redux action creators
The evolution of redux action creators
 
The redux saga begins
The redux saga beginsThe redux saga begins
The redux saga begins
 
Rxjs kyivjs 2015
Rxjs kyivjs 2015Rxjs kyivjs 2015
Rxjs kyivjs 2015
 
Redux saga: managing your side effects. Also: generators in es6
Redux saga: managing your side effects. Also: generators in es6Redux saga: managing your side effects. Also: generators in es6
Redux saga: managing your side effects. Also: generators in es6
 
Intro to Reactive Programming with Swift
Intro to Reactive Programming with SwiftIntro to Reactive Programming with Swift
Intro to Reactive Programming with Swift
 
Developing iOS apps with Swift
Developing iOS apps with SwiftDeveloping iOS apps with Swift
Developing iOS apps with Swift
 
Standford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCs
Standford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCsStandford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCs
Standford 2015 week4: 1.Protocols and Delegation, Gestures 2. Multiple MVCs
 
rx.js make async programming simpler
rx.js make async programming simplerrx.js make async programming simpler
rx.js make async programming simpler
 
Standford 2015 week3: Objective-C Compatibility, Property List, Views
Standford 2015 week3: Objective-C Compatibility, Property List, ViewsStandford 2015 week3: Objective-C Compatibility, Property List, Views
Standford 2015 week3: Objective-C Compatibility, Property List, Views
 
FrontendLab: Programming UI with FRP and Bacon js - Вячеслав Ворончук
FrontendLab: Programming UI with FRP and Bacon js - Вячеслав ВорончукFrontendLab: Programming UI with FRP and Bacon js - Вячеслав Ворончук
FrontendLab: Programming UI with FRP and Bacon js - Вячеслав Ворончук
 

Similar to The evolution of asynchronous JavaScript

Chaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscoreChaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscore
Nicolas Carlo
 
Understanding Asynchronous JavaScript
Understanding Asynchronous JavaScriptUnderstanding Asynchronous JavaScript
Understanding Asynchronous JavaScript
jnewmanux
 
Akka Futures and Akka Remoting
Akka Futures  and Akka RemotingAkka Futures  and Akka Remoting
Akka Futures and Akka Remoting
Knoldus Inc.
 
The Strange World of Javascript and all its little Asynchronous Beasts
The Strange World of Javascript and all its little Asynchronous BeastsThe Strange World of Javascript and all its little Asynchronous Beasts
The Strange World of Javascript and all its little Asynchronous Beasts
Federico Galassi
 
ES6: The Awesome Parts
ES6: The Awesome PartsES6: The Awesome Parts
ES6: The Awesome Parts
Domenic Denicola
 
Async js - Nemetschek Presentaion @ HackBulgaria
Async js - Nemetschek Presentaion @ HackBulgariaAsync js - Nemetschek Presentaion @ HackBulgaria
Async js - Nemetschek Presentaion @ HackBulgaria
HackBulgaria
 
From Node.js to Design Patterns - BuildPiper
From Node.js to Design Patterns - BuildPiperFrom Node.js to Design Patterns - BuildPiper
From Node.js to Design Patterns - BuildPiper
Luciano Mammino
 
You promise?
You promise?You promise?
You promise?
IT Weekend
 
Droidjam 2019 flutter isolates pdf
Droidjam 2019 flutter isolates pdfDroidjam 2019 flutter isolates pdf
Droidjam 2019 flutter isolates pdf
Anvith Bhat
 
Promises, promises, and then observables
Promises, promises, and then observablesPromises, promises, and then observables
Promises, promises, and then observables
Stefan Charsley
 
Intro to Asynchronous Javascript
Intro to Asynchronous JavascriptIntro to Asynchronous Javascript
Intro to Asynchronous Javascript
Garrett Welson
 
Javascript & Ajax Basics
Javascript & Ajax BasicsJavascript & Ajax Basics
Javascript & Ajax BasicsRichard Paul
 
Chaining et composition de fonctions avec lodash / underscore
Chaining et composition de fonctions avec lodash / underscoreChaining et composition de fonctions avec lodash / underscore
Chaining et composition de fonctions avec lodash / underscore
Nicolas Carlo
 
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Domenic Denicola
 
Promises are so passé - Tim Perry - Codemotion Milan 2016
Promises are so passé - Tim Perry - Codemotion Milan 2016Promises are so passé - Tim Perry - Codemotion Milan 2016
Promises are so passé - Tim Perry - Codemotion Milan 2016
Codemotion
 
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
Doug Jones
 
Async Frontiers
Async FrontiersAsync Frontiers
Async Frontiers
Domenic Denicola
 
Andrii Orlov "Generators Flexibility in Modern Code"
Andrii Orlov "Generators Flexibility in Modern Code"Andrii Orlov "Generators Flexibility in Modern Code"
Andrii Orlov "Generators Flexibility in Modern Code"
LogeekNightUkraine
 
ES6 Overview
ES6 OverviewES6 Overview
ES6 Overview
Bruno Scopelliti
 

Similar to The evolution of asynchronous JavaScript (20)

Chaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscoreChaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscore
 
Understanding Asynchronous JavaScript
Understanding Asynchronous JavaScriptUnderstanding Asynchronous JavaScript
Understanding Asynchronous JavaScript
 
Akka Futures and Akka Remoting
Akka Futures  and Akka RemotingAkka Futures  and Akka Remoting
Akka Futures and Akka Remoting
 
The Strange World of Javascript and all its little Asynchronous Beasts
The Strange World of Javascript and all its little Asynchronous BeastsThe Strange World of Javascript and all its little Asynchronous Beasts
The Strange World of Javascript and all its little Asynchronous Beasts
 
ES6: The Awesome Parts
ES6: The Awesome PartsES6: The Awesome Parts
ES6: The Awesome Parts
 
Async js - Nemetschek Presentaion @ HackBulgaria
Async js - Nemetschek Presentaion @ HackBulgariaAsync js - Nemetschek Presentaion @ HackBulgaria
Async js - Nemetschek Presentaion @ HackBulgaria
 
From Node.js to Design Patterns - BuildPiper
From Node.js to Design Patterns - BuildPiperFrom Node.js to Design Patterns - BuildPiper
From Node.js to Design Patterns - BuildPiper
 
You promise?
You promise?You promise?
You promise?
 
Droidjam 2019 flutter isolates pdf
Droidjam 2019 flutter isolates pdfDroidjam 2019 flutter isolates pdf
Droidjam 2019 flutter isolates pdf
 
Promises, promises, and then observables
Promises, promises, and then observablesPromises, promises, and then observables
Promises, promises, and then observables
 
Intro to Asynchronous Javascript
Intro to Asynchronous JavascriptIntro to Asynchronous Javascript
Intro to Asynchronous Javascript
 
Javascript & Ajax Basics
Javascript & Ajax BasicsJavascript & Ajax Basics
Javascript & Ajax Basics
 
Chaining et composition de fonctions avec lodash / underscore
Chaining et composition de fonctions avec lodash / underscoreChaining et composition de fonctions avec lodash / underscore
Chaining et composition de fonctions avec lodash / underscore
 
JavaScript Core
JavaScript CoreJavaScript Core
JavaScript Core
 
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
 
Promises are so passé - Tim Perry - Codemotion Milan 2016
Promises are so passé - Tim Perry - Codemotion Milan 2016Promises are so passé - Tim Perry - Codemotion Milan 2016
Promises are so passé - Tim Perry - Codemotion Milan 2016
 
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
 
Async Frontiers
Async FrontiersAsync Frontiers
Async Frontiers
 
Andrii Orlov "Generators Flexibility in Modern Code"
Andrii Orlov "Generators Flexibility in Modern Code"Andrii Orlov "Generators Flexibility in Modern Code"
Andrii Orlov "Generators Flexibility in Modern Code"
 
ES6 Overview
ES6 OverviewES6 Overview
ES6 Overview
 

More from Alessandro Cinelli (cirpo)

Dear JavaScript
Dear JavaScriptDear JavaScript
The journey to become a solid developer
The journey to become a solid developer The journey to become a solid developer
The journey to become a solid developer
Alessandro Cinelli (cirpo)
 
The evolution of asynchronous javascript
The evolution of asynchronous javascriptThe evolution of asynchronous javascript
The evolution of asynchronous javascript
Alessandro Cinelli (cirpo)
 
PHP is the King, nodejs the prince and python the fool
PHP is the King, nodejs the prince and python the foolPHP is the King, nodejs the prince and python the fool
PHP is the King, nodejs the prince and python the fool
Alessandro Cinelli (cirpo)
 
Apt get no more let Vagrant, Puppet and Docker take the stage
Apt get no more let Vagrant, Puppet and Docker take the stageApt get no more let Vagrant, Puppet and Docker take the stage
Apt get no more let Vagrant, Puppet and Docker take the stage
Alessandro Cinelli (cirpo)
 
PHP is the king, nodejs is the prince and Lua is the fool
PHP is the king, nodejs is the prince and Lua is the foolPHP is the king, nodejs is the prince and Lua is the fool
PHP is the king, nodejs is the prince and Lua is the foolAlessandro Cinelli (cirpo)
 
Don't screw it up! How to build durable API
Don't screw it up! How to build durable API Don't screw it up! How to build durable API
Don't screw it up! How to build durable API
Alessandro Cinelli (cirpo)
 
PHP is the King, nodejs is the Prince and Lua is the fool
PHP is the King, nodejs is the Prince and Lua is the foolPHP is the King, nodejs is the Prince and Lua is the fool
PHP is the King, nodejs is the Prince and Lua is the fool
Alessandro Cinelli (cirpo)
 
Don't screw it up: how to build durable web apis
Don't screw it up: how to build durable web apisDon't screw it up: how to build durable web apis
Don't screw it up: how to build durable web apis
Alessandro Cinelli (cirpo)
 
Nodejsconf 2012 - opening
Nodejsconf 2012 - openingNodejsconf 2012 - opening
Nodejsconf 2012 - opening
Alessandro Cinelli (cirpo)
 
Symfonyday Keynote
Symfonyday KeynoteSymfonyday Keynote
Symfonyday Keynote
Alessandro Cinelli (cirpo)
 
Introduzione a GIT - Webinar Zend
Introduzione a GIT - Webinar ZendIntroduzione a GIT - Webinar Zend
Introduzione a GIT - Webinar Zend
Alessandro Cinelli (cirpo)
 
BDD - Buzzword Driven Development - Build the next cool app for fun and for.....
BDD - Buzzword Driven Development - Build the next cool app for fun and for.....BDD - Buzzword Driven Development - Build the next cool app for fun and for.....
BDD - Buzzword Driven Development - Build the next cool app for fun and for.....
Alessandro Cinelli (cirpo)
 
AgileTour Brescia - Metodi Agili: lavorare in modo sostenibile e vincente in ...
AgileTour Brescia - Metodi Agili: lavorare in modo sostenibile e vincente in ...AgileTour Brescia - Metodi Agili: lavorare in modo sostenibile e vincente in ...
AgileTour Brescia - Metodi Agili: lavorare in modo sostenibile e vincente in ...Alessandro Cinelli (cirpo)
 
Presentazione framework Symfony
Presentazione framework Symfony Presentazione framework Symfony
Presentazione framework Symfony
Alessandro Cinelli (cirpo)
 

More from Alessandro Cinelli (cirpo) (18)

Dear JavaScript
Dear JavaScriptDear JavaScript
Dear JavaScript
 
The journey to become a solid developer
The journey to become a solid developer The journey to become a solid developer
The journey to become a solid developer
 
The evolution of asynchronous javascript
The evolution of asynchronous javascriptThe evolution of asynchronous javascript
The evolution of asynchronous javascript
 
PHP is the King, nodejs the prince and python the fool
PHP is the King, nodejs the prince and python the foolPHP is the King, nodejs the prince and python the fool
PHP is the King, nodejs the prince and python the fool
 
Apt get no more let Vagrant, Puppet and Docker take the stage
Apt get no more let Vagrant, Puppet and Docker take the stageApt get no more let Vagrant, Puppet and Docker take the stage
Apt get no more let Vagrant, Puppet and Docker take the stage
 
PHP is the king, nodejs is the prince and Lua is the fool
PHP is the king, nodejs is the prince and Lua is the foolPHP is the king, nodejs is the prince and Lua is the fool
PHP is the king, nodejs is the prince and Lua is the fool
 
Don't screw it up! How to build durable API
Don't screw it up! How to build durable API Don't screw it up! How to build durable API
Don't screw it up! How to build durable API
 
PHP is the King, nodejs is the Prince and Lua is the fool
PHP is the King, nodejs is the Prince and Lua is the foolPHP is the King, nodejs is the Prince and Lua is the fool
PHP is the King, nodejs is the Prince and Lua is the fool
 
Don't screw it up: how to build durable web apis
Don't screw it up: how to build durable web apisDon't screw it up: how to build durable web apis
Don't screw it up: how to build durable web apis
 
Nodejsconf 2012 - opening
Nodejsconf 2012 - openingNodejsconf 2012 - opening
Nodejsconf 2012 - opening
 
Symfonyday Keynote
Symfonyday KeynoteSymfonyday Keynote
Symfonyday Keynote
 
Introduzione a GIT - Webinar Zend
Introduzione a GIT - Webinar ZendIntroduzione a GIT - Webinar Zend
Introduzione a GIT - Webinar Zend
 
BDD - Buzzword Driven Development - Build the next cool app for fun and for.....
BDD - Buzzword Driven Development - Build the next cool app for fun and for.....BDD - Buzzword Driven Development - Build the next cool app for fun and for.....
BDD - Buzzword Driven Development - Build the next cool app for fun and for.....
 
AgileTour Brescia - Metodi Agili: lavorare in modo sostenibile e vincente in ...
AgileTour Brescia - Metodi Agili: lavorare in modo sostenibile e vincente in ...AgileTour Brescia - Metodi Agili: lavorare in modo sostenibile e vincente in ...
AgileTour Brescia - Metodi Agili: lavorare in modo sostenibile e vincente in ...
 
Symfony2 and Ror3 friends for an hour
Symfony2 and Ror3 friends for an hourSymfony2 and Ror3 friends for an hour
Symfony2 and Ror3 friends for an hour
 
Git e Git Flow
Git e Git Flow Git e Git Flow
Git e Git Flow
 
Presentazione framework Symfony
Presentazione framework Symfony Presentazione framework Symfony
Presentazione framework Symfony
 
Web 2.0 sviluppare e ottimizzare oggi
Web 2.0 sviluppare e ottimizzare oggiWeb 2.0 sviluppare e ottimizzare oggi
Web 2.0 sviluppare e ottimizzare oggi
 

Recently uploaded

Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
Thijs Feryn
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
Dorra BARTAGUIZ
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
Product School
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
Paul Groth
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Product School
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
Product School
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
91mobiles
 
Generating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using SmithyGenerating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using Smithy
g2nightmarescribd
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
Guy Korland
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Product School
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
ThousandEyes
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Thierry Lestable
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
Jemma Hussein Allen
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Albert Hoitingh
 
Connector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonConnector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a button
DianaGray10
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
OnBoard
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance
 

Recently uploaded (20)

Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
Generating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using SmithyGenerating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using Smithy
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
 
Connector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonConnector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a button
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
 

The evolution of asynchronous JavaScript