SlideShare a Scribd company logo
1 of 98
Download to read offline
Don't block the event loop!
JavaScript Async for Effortless UX
Jaeseok Kang

(kang89kr@gmail.com)
Jaeseok Kang
JSConf Korea 2019JS
Jaeseok Kang
JSConf Korea 2019JSConf Korea 2019
Jaeseok Kang
I'm going to talk about..!
Cause SolutionProblem
Cause Solution
• "Page freeze.."

• "Responding to
user input too
slow.."

• "Glitchy
animations.."

• ...
Problem
• run-to-completion

• javascript engine

• call stack

• event loop

• task queue

• ...
• worker

• scheduling

• ...
This is an exploration
for a better solution,
not a clear solution.
⚠
User Experience
Users' feelings about using a product, system or service
https://userexperiencerocks.wordpress.com/2015/08/20/then-my-kiddo-asked-whats-the-difference-between-ux-ui/
• "Page freeze.."

• "Responding to user input too slow.."

• "Glitchy animations.."
Why do they happen?
Something may be slowing things
down and blocking others. #
Run-to-completion $
Run-to-completion
• Each message is processed completely before any other
message is processed.
let running = true
setTimeout(() => {
console.log('Will it be print?')
}, 500)
while(true) {
if (!running) {
break
}
console.log('Running...', Date.now())
}
let running = true
setTimeout(() => {
console.log('Will it be print?')
}, 500)
while(true) {
if (!running) {
break
}
console.log('Running...', Date.now())
}
1.set running to true
let running = true
setTimeout(() => {
console.log('Will it be print?')
}, 500)
while(true) {
if (!running) {
break
}
console.log('Running...', Date.now())
}
1.set running to true
2.run setTimeout function
let running = true
setTimeout(() => {
console.log('Will it be print?')
}, 500)
while(true) {
if (!running) {
break
}
console.log('Running...', Date.now())
}
1.set running to true
2.run setTimeout function
3.start while loop block
let running = true
setTimeout(() => {
console.log('Will it be print?')
}, 500)
while(true) {
if (!running) {
break
}
console.log('Running...', Date.now())
}
1.set running to true
2.run setTimeout function
3.start while loop block
4.check if running have changed
let running = true
setTimeout(() => {
console.log('Will it be print?')
}, 500)
while(true) {
if (!running) {
break
}
console.log('Running...', Date.now())
}
1.set running to true
2.run setTimeout function
3.start while loop block
4.check if running have changed
5.print log 'Running...'
let running = true
setTimeout(() => {
console.log('Will it be print?')
}, 500)
while(true) {
if (!running) {
break
}
console.log('Running...', Date.now())
}
1.set running to true
2.run setTimeout function
3.start while loop block
4.check if running have changed
5.print log 'Running...'
6.500ms later... running still true
let running = true
setTimeout(() => {
console.log('Will it be print?')
}, 500)
while(true) {
if (!running) {
break
}
console.log('Running...', Date.now())
}
1.set running to true
2.run setTimeout function
3.start while loop block
4.check if running have changed
5.print log 'Running...'
6.500ms later... running still true
7.running is true as ever..
let running = true
setTimeout(() => {
console.log('Will it be print?')
}, 500)
while(true) {
if (!running) {
break
}
console.log('Running...', Date.now())
}
1.set running to true
2.run setTimeout function
3.start while loop block
4.check if running have changed
5.print log 'Running...'
6.500ms later... running still true
7.running is true as ever..
8.and ever...
let running = true
setTimeout(() => {
console.log('Will it be print?')
}, 500)
while(true) {
if (!running) {
break
}
console.log('Running...', Date.now())
}
1.set running to true
2.run setTimeout function
3.start while loop block
4.check if running have changed
5.print log 'Running...'
6.500ms later... running still true
7.running is true as ever..
8.and ever...
9. ...forever....
let running = true
setTimeout(() => {
console.log('Will it be print?')
}, 500)
while(true) {
if (!running) {
break
}
console.log('Running...', Date.now())
}
Call stack %
function hello() {
console.log('hello')
}
function helloJsConf() {
hello()
console.log('JSConfKorea')
}
helloJsConf()
function hello() {
console.log('hello')
}
function helloJsConf() {
hello()
console.log('JSConfKorea')
}
helloJsConf()
main()
function hello() {
console.log('hello')
}
function helloJsConf() {
hello()
console.log('JSConfKorea')
}
helloJsConf()
helloJsConf()
main()
function hello() {
console.log('hello')
}
function helloJsConf() {
hello()
console.log('JSConfKorea')
}
helloJsConf()
helloJsConf()
hello()
main()
function hello() {
console.log('hello')
}
function helloJsConf() {
hello()
console.log('JSConfKorea')
}
helloJsConf()
helloJsConf()
hello()
main()
console.log("hello")
function hello() {
console.log('hello')
}
function helloJsConf() {
hello()
console.log('JSConfKorea')
}
helloJsConf()
helloJsConf()
hello()
main()
function hello() {
console.log('hello')
}
function helloJsConf() {
hello()
console.log('JSConfKorea')
}
helloJsConf()
helloJsConf()
main()
function hello() {
console.log('hello')
}
function helloJsConf() {
hello()
console.log('JSConfKorea')
}
helloJsConf()
helloJsConf()
main()
console.log("jsConfKorea")
function hello() {
console.log('hello')
}
function helloJsConf() {
hello()
console.log('JSConfKorea')
}
helloJsConf()
helloJsConf()
main()
function hello() {
console.log('hello')
}
function helloJsConf() {
hello()
console.log('JSConfKorea')
}
helloJsConf()
main()
function hello() {
console.log('hello')
}
function helloJsConf() {
hello()
console.log('JSConfKorea')
}
helloJsConf()
Let’s say we have some
expensive task &
function someExpensive() {
...
}
function hello() {
someExpensive()
console.log('hello')
}
function helloJsConf() {
hello()
console.log('JSConfKorea')
}
helloJsConf()
main()
function someExpensive() {
...
}
function hello() {
someExpensive()
console.log('hello')
}
function helloJsConf() {
hello()
console.log('JSConfKorea')
}
helloJsConf()
helloJsConf()
main()
function someExpensive() {
...
}
function hello() {
someExpensive()
console.log('hello')
}
function helloJsConf() {
hello()
console.log('JSConfKorea')
}
helloJsConf()
helloJsConf()
hello()
main()
function someExpensive() {
...
}
function hello() {
someExpensive()
console.log('hello')
}
function helloJsConf() {
hello()
console.log('JSConfKorea')
}
helloJsConf()
helloJsConf()
hello()
main()
function someExpensive() {
...
}
function hello() {
someExpensive()
console.log('hello')
}
function helloJsConf() {
hello()
console.log('JSConfKorea')
}
helloJsConf()
someExpensive()
helloJsConf()
hello()
main()
function someExpensive() {
...
}
function hello() {
someExpensive()
console.log('hello')
}
function helloJsConf() {
hello()
console.log('JSConfKorea')
}
helloJsConf()
someExpensive()
'
How to handle concurrency
in browser? ⚙
Web APIs ⏱
•dom events

•XMLHttpRequest

•setTimeout

•Promise

•requestAnimationFrame

•...
Event loop *
Event loop *
Event loop
while(queue.waitForMessage()) {
queue.processNextMessage()
}
https://developer.mozilla.org/ko/docs/Web/JavaScript/EventLoop#Event_loop
Event loop
• Event loop manages what task
is to be pushed in the Callstack.
Event loop
1. While there are tasks:

• execute the oldest task.

2. Sleep until a task appears, then go to 1.
setTimeout(() => {
console.log('hello')
})
Promise.resolve().then(() => {
console.log('JSConfKorea')
})
Call Stack
Tasks
Event Loop
setTimeout(() => {
console.log('hello')
})
Promise.resolve().then(() => {
console.log('JSConfKorea')
})setTimeout()
Call Stack
Tasks
Event Loop
setTimeout(() => {
console.log('hello')
})
Promise.resolve().then(() => {
console.log('JSConfKorea')
})
Call Stack
Tasks
Event Loop
hello
Task
setTimeout(() => {
console.log('hello')
})
Promise.resolve().then(() => {
console.log('JSConfKorea')
})Promise.resolve.then()
Call Stack
Tasks
Event Loop
hello
Task
Microtasks
setTimeout(() => {
console.log('hello')
})
Promise.resolve().then(() => {
console.log('JSConfKorea')
})Promise.resolve.then()
Call Stack
Tasks
Event Loop
hello
Task
Microtasks
setTimeout(() => {
console.log('hello')
})
Promise.resolve().then(() => {
console.log('JSConfKorea')
})
Call Stack
Tasks
Event Loop
hello
Task
jsConfKorea
Micro Task
Microtasks
setTimeout(() => {
console.log('hello')
})
Promise.resolve().then(() => {
console.log('JSConfKorea')
})
Call Stack
Tasks
Event Loop
hello
Task
jsConfKorea
Micro Task
?
Task & Microtask
•Task
Task that should execute sequentially in browser

Source : setTimeout, running scripts, UI events..

•Microtask
Async task that should happen after the currently
executing script

Microtask queue has a higher priority than the task
queue.

Source : Promise, MutationObserver, process.nextTick
Event loop
1. While there are tasks:

• execute the oldest task.

2. Sleep until a task appears, then go to 1.
Event loop - Detail
1. If the microtask queue is not empty,
execute all microtasks
2. While there are tasks:

• execute the oldest task.

3. Sleep until a task appears, then go to 1.
Call Stack
Tasks
Event Loop
hello
Task
jsConfKorea
Micro Task
Microtasks
setTimeout(() => {
console.log('hello')
})
Promise.resolve().then(() => {
console.log('JSConfKorea')
})
Call Stack
Tasks
Event Loop
hello
Task
jsConfKorea
Micro Task
Microtasks
setTimeout(() => {
console.log('hello')
})
Promise.resolve().then(() => {
console.log('JSConfKorea')
})
Call Stack
Tasks
Event Loop
hello
Task
Microtasks
setTimeout(() => {
console.log('hello')
})
Promise.resolve().then(() => {
console.log('JSConfKorea')
})
Call Stack
Tasks
Event Loop
hello
Task
Microtasks
setTimeout(() => {
console.log('hello')
})
Promise.resolve().then(() => {
console.log('JSConfKorea')
})
Call Stack
Tasks
Event Loop
Microtasks
setTimeout(() => {
console.log('hello')
})
Promise.resolve().then(() => {
console.log('JSConfKorea')
})
So...
Can asynchronous JavaScript
solve all the problems?
So...
Can asynchronous JavaScript
solve all the problems?
+
function someExpensive() {
...
}
setTimeout(() => {
console.log('hello JSConfKorea')
})
Promise.resolve().then(() => {
someExpensive()
})
Call Stack
Event Loop
Tasks
Microtasks
function someExpensive() {
...
}
setTimeout(() => {
console.log('hello JSConfKorea')
})
Promise.resolve().then(() => {
someExpensive()
})
setTimeout()
Call Stack
Event Loop
Tasks
Microtasks
function someExpensive() {
...
}
setTimeout(() => {
console.log('hello JSConfKorea')
})
Promise.resolve().then(() => {
someExpensive()
})
Call Stack
Event Loop hello JSConfKorea
Task
Tasks
Microtasks
function someExpensive() {
...
}
setTimeout(() => {
console.log('hello JSConfKorea')
})
Promise.resolve().then(() => {
someExpensive()
})
Promise.resolve.then()
Call Stack
Event Loop hello JSConfKorea
Task
Tasks
Microtasks
function someExpensive() {
...
}
setTimeout(() => {
console.log('hello JSConfKorea')
})
Promise.resolve().then(() => {
someExpensive()
})
Call Stack
Event Loop hello JSConfKorea
Task
someExpensive
Micro Task
Tasks
Microtasks
function someExpensive() {
...
}
setTimeout(() => {
console.log('hello JSConfKorea')
})
Promise.resolve().then(() => {
someExpensive()
})
Call Stack
Event Loop hello JSConfKorea
Task
someExpensive
Micro Task
Tasks
Microtasks
function someExpensive() {
...
}
setTimeout(() => {
console.log('hello JSConfKorea')
})
Promise.resolve().then(() => {
someExpensive()
})
Call Stack
Event Loop hello JSConfKorea
Task
someExpensive
Micro Task
'
Tasks
Microtasks
• Task is always executed sequentially by event loop.

Other task cannot be performed when any task is running.

• Microtask queue has a higher priority than the task queue.

So, UI-related events cannot be executed again until all
microtasks accumulated in the queue are cleared.

• What if long running stacked tasks or microtasks block event
that is directly connected to UI such as rendering, click, input?

janky UI/UX occurs... ,
How to handle this blocking?
'
Demo
https://github.com/jaeseokk/ui-block-demo
inputEl.addEventListener('input', (e) => {
const textLength = e.target.value.length
let result = ''
for (let i; i < getSquareCounts(textLength); i++) {
result += makeSquareWithRandomColorHtml()
}
containerEl.innerHTML = result
})
inputEl.addEventListener('input', (e) => {
const textLength = e.target.value.length
let result = ''
for (let i; i < getSquareCounts(textLength); i++) {
result += makeSquareWithRandomColorHtml()
}
containerEl.innerHTML = result
})
Too many iterations
inputEl.addEventListener('input', (e) => {
const textLength = e.target.value.length
let result = ''
for (let i; i < getSquareCounts(textLength); i++) {
result += makeSquareWithRandomColorHtml()
}
containerEl.innerHTML = result
})
Too many iterations
Costly DOM changes
•With another thread...? 

- Web Workers

•Split some expensive task into small tasks...? 

- Scheduling
Web Workers
•Web Workers makes it possible to
run a script operation in a
background thread separate from the
main execution thread of a web
application.
https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API
Main Thread Worker Thread
2. result = runLongRunningTask()
1. postMessage()
3. postMessage(result)
4. doSomethingWith(result)
self.addEventListener('message', e => {
const result = runLongRunningTask()
postMessage(result)
})
// spawn a worker
const worker = new Worker('worker.js')
// send messages to a worker for request run long-runnging-task
worker.postMessage(message)
// handle a `message` event from a worker
worker.onmessage = e => {
doSomethingWith(e)
}
worker.js
main.js
Limitations
• Data is sent between workers and the main
thread via a system of messages.

• Worker cannot access directly the DOM,
context.
Scheduling
• Slice your heavy task in light sub-tasks and run
them asynchronously.
TaskLong Running Task TaskTask Task
Task TaskTask Task
function* chunkGenerator (textLength) {
let result = ''
for (let i = 0; i < getSquareCounts(textLength) / CHUNK_UNIT; i++) {
for (let j = 0; j < CHUNK_UNIT; j++) {
result = makeSquareWithRandomColorHtml()
}
yield
}
containerEl.innerHTML = result
}
inputEl.addEventListener('input', (e) => {
const textLength = e.target.value.length
runChunks(chunkGenerator(textLength))
})
inputEl.addEventListener('input', (e) => {
const textLength = e.target.value.length
let result = ''
for (let i = 0; i < getSquareCounts(textLength); i++) {
result += makeSquareWithRandomColorHtml()
}
containerEl.innerHTML = result
})
AS-IS
TO-BE
https://github.com/jaeseokk/chunk-scheduler
inputEl.addEventListener('input', (e) => {
const textLength = e.target.value.length
if (isRunning()) {
cancel()
}
runChunks(chunkGenerator(textLength))
})
Recap
• If long-running-tasks or microtasks block rendering, click, and
text input, a janky UI that harms user experience can be
delivered can occur.
• This is due to the structure of the JavaScript engine, event-
loop, etc. and needs to understand and handle properly.
• To handle this, Delegate long-running-tasks to other threads
using Web Worker,
• Or, split the long-running-task properly so that other important
UI events do not block.
Thank you -

More Related Content

What's hot

Arquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackArquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackNelson Glauber Leal
 
Introduction to Nodejs
Introduction to NodejsIntroduction to Nodejs
Introduction to NodejsGabriele Lana
 
Future Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NETFuture Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NETGianluca Carucci
 
Introduction to node.js
Introduction to node.jsIntroduction to node.js
Introduction to node.jsjacekbecela
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applicationsTom Croucher
 
Understanding Asynchronous JavaScript
Understanding Asynchronous JavaScriptUnderstanding Asynchronous JavaScript
Understanding Asynchronous JavaScriptjnewmanux
 
Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}.toster
 
introduction to node.js
introduction to node.jsintroduction to node.js
introduction to node.jsorkaplan
 
The State of JavaScript (2015)
The State of JavaScript (2015)The State of JavaScript (2015)
The State of JavaScript (2015)Domenic Denicola
 
node.js: Javascript's in your backend
node.js: Javascript's in your backendnode.js: Javascript's in your backend
node.js: Javascript's in your backendDavid Padbury
 
Building servers with Node.js
Building servers with Node.jsBuilding servers with Node.js
Building servers with Node.jsConFoo
 
Vue.js + Django - configuración para desarrollo con webpack y HMR
Vue.js + Django - configuración para desarrollo con webpack y HMRVue.js + Django - configuración para desarrollo con webpack y HMR
Vue.js + Django - configuración para desarrollo con webpack y HMRJavier Abadía
 
Future of Web Apps: Google Gears
Future of Web Apps: Google GearsFuture of Web Apps: Google Gears
Future of Web Apps: Google Gearsdion
 
Angular 1 + es6
Angular 1 + es6Angular 1 + es6
Angular 1 + es6장현 한
 
Server Side JavaScript - You ain't seen nothing yet
Server Side JavaScript - You ain't seen nothing yetServer Side JavaScript - You ain't seen nothing yet
Server Side JavaScript - You ain't seen nothing yetTom Croucher
 
A million connections and beyond - Node.js at scale
A million connections and beyond - Node.js at scaleA million connections and beyond - Node.js at scale
A million connections and beyond - Node.js at scaleTom Croucher
 
Aplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackAplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackNelson Glauber Leal
 
Boom! Promises/A+ Was Born
Boom! Promises/A+ Was BornBoom! Promises/A+ Was Born
Boom! Promises/A+ Was BornDomenic Denicola
 

What's hot (20)

Node azure
Node azureNode azure
Node azure
 
Arquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackArquitetando seu app Android com Jetpack
Arquitetando seu app Android com Jetpack
 
Introduction to Nodejs
Introduction to NodejsIntroduction to Nodejs
Introduction to Nodejs
 
Future Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NETFuture Decoded - Node.js per sviluppatori .NET
Future Decoded - Node.js per sviluppatori .NET
 
Introduction to node.js
Introduction to node.jsIntroduction to node.js
Introduction to node.js
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applications
 
Understanding Asynchronous JavaScript
Understanding Asynchronous JavaScriptUnderstanding Asynchronous JavaScript
Understanding Asynchronous JavaScript
 
Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}
 
introduction to node.js
introduction to node.jsintroduction to node.js
introduction to node.js
 
The State of JavaScript (2015)
The State of JavaScript (2015)The State of JavaScript (2015)
The State of JavaScript (2015)
 
node.js: Javascript's in your backend
node.js: Javascript's in your backendnode.js: Javascript's in your backend
node.js: Javascript's in your backend
 
Building servers with Node.js
Building servers with Node.jsBuilding servers with Node.js
Building servers with Node.js
 
Vue.js + Django - configuración para desarrollo con webpack y HMR
Vue.js + Django - configuración para desarrollo con webpack y HMRVue.js + Django - configuración para desarrollo con webpack y HMR
Vue.js + Django - configuración para desarrollo con webpack y HMR
 
Scalable Web Apps
Scalable Web AppsScalable Web Apps
Scalable Web Apps
 
Future of Web Apps: Google Gears
Future of Web Apps: Google GearsFuture of Web Apps: Google Gears
Future of Web Apps: Google Gears
 
Angular 1 + es6
Angular 1 + es6Angular 1 + es6
Angular 1 + es6
 
Server Side JavaScript - You ain't seen nothing yet
Server Side JavaScript - You ain't seen nothing yetServer Side JavaScript - You ain't seen nothing yet
Server Side JavaScript - You ain't seen nothing yet
 
A million connections and beyond - Node.js at scale
A million connections and beyond - Node.js at scaleA million connections and beyond - Node.js at scale
A million connections and beyond - Node.js at scale
 
Aplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackAplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & Jetpack
 
Boom! Promises/A+ Was Born
Boom! Promises/A+ Was BornBoom! Promises/A+ Was Born
Boom! Promises/A+ Was Born
 

Similar to JavaScript Async for Effortless UX

Deep Dive into Zone.JS
Deep Dive into Zone.JSDeep Dive into Zone.JS
Deep Dive into Zone.JSIlia Idakiev
 
Event Loop in Javascript
Event Loop in JavascriptEvent Loop in Javascript
Event Loop in JavascriptDiptiGandhi4
 
Playing With Fire - An Introduction to Node.js
Playing With Fire - An Introduction to Node.jsPlaying With Fire - An Introduction to Node.js
Playing With Fire - An Introduction to Node.jsMike Hagedorn
 
An opinionated intro to Node.js - devrupt hospitality hackathon
An opinionated intro to Node.js - devrupt hospitality hackathonAn opinionated intro to Node.js - devrupt hospitality hackathon
An opinionated intro to Node.js - devrupt hospitality hackathonLuciano Mammino
 
Unit Testing JavaScript Applications
Unit Testing JavaScript ApplicationsUnit Testing JavaScript Applications
Unit Testing JavaScript ApplicationsYnon Perek
 
Paradigma FP y OOP usando técnicas avanzadas de Programación | Programacion A...
Paradigma FP y OOP usando técnicas avanzadas de Programación | Programacion A...Paradigma FP y OOP usando técnicas avanzadas de Programación | Programacion A...
Paradigma FP y OOP usando técnicas avanzadas de Programación | Programacion A...Víctor Bolinches
 
The journey of asyncio adoption in instagram
The journey of asyncio adoption in instagramThe journey of asyncio adoption in instagram
The journey of asyncio adoption in instagramJimmy Lai
 
Aplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackAplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackNelson Glauber Leal
 
Golang Performance : microbenchmarks, profilers, and a war story
Golang Performance : microbenchmarks, profilers, and a war storyGolang Performance : microbenchmarks, profilers, and a war story
Golang Performance : microbenchmarks, profilers, and a war storyAerospike
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.jsNodeXperts
 
Promise: async programming hero
Promise: async programming heroPromise: async programming hero
Promise: async programming heroThe Software House
 
An Introduction to Go
An Introduction to GoAn Introduction to Go
An Introduction to GoCloudflare
 
PWA 與 Service Worker
PWA 與 Service WorkerPWA 與 Service Worker
PWA 與 Service WorkerAnna Su
 
Javascript Everywhere
Javascript EverywhereJavascript Everywhere
Javascript EverywherePascal Rettig
 
Aplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e JetpackAplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e JetpackNelson Glauber Leal
 
Douglas Crockford: Serversideness
Douglas Crockford: ServersidenessDouglas Crockford: Serversideness
Douglas Crockford: ServersidenessWebExpo
 
Async programming and python
Async programming and pythonAsync programming and python
Async programming and pythonChetan Giridhar
 

Similar to JavaScript Async for Effortless UX (20)

Performance patterns
Performance patternsPerformance patterns
Performance patterns
 
Deep Dive into Zone.JS
Deep Dive into Zone.JSDeep Dive into Zone.JS
Deep Dive into Zone.JS
 
Event Loop in Javascript
Event Loop in JavascriptEvent Loop in Javascript
Event Loop in Javascript
 
Playing With Fire - An Introduction to Node.js
Playing With Fire - An Introduction to Node.jsPlaying With Fire - An Introduction to Node.js
Playing With Fire - An Introduction to Node.js
 
An opinionated intro to Node.js - devrupt hospitality hackathon
An opinionated intro to Node.js - devrupt hospitality hackathonAn opinionated intro to Node.js - devrupt hospitality hackathon
An opinionated intro to Node.js - devrupt hospitality hackathon
 
Unit Testing JavaScript Applications
Unit Testing JavaScript ApplicationsUnit Testing JavaScript Applications
Unit Testing JavaScript Applications
 
Paradigma FP y OOP usando técnicas avanzadas de Programación | Programacion A...
Paradigma FP y OOP usando técnicas avanzadas de Programación | Programacion A...Paradigma FP y OOP usando técnicas avanzadas de Programación | Programacion A...
Paradigma FP y OOP usando técnicas avanzadas de Programación | Programacion A...
 
The journey of asyncio adoption in instagram
The journey of asyncio adoption in instagramThe journey of asyncio adoption in instagram
The journey of asyncio adoption in instagram
 
Aplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackAplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & Jetpack
 
Golang Performance : microbenchmarks, profilers, and a war story
Golang Performance : microbenchmarks, profilers, and a war storyGolang Performance : microbenchmarks, profilers, and a war story
Golang Performance : microbenchmarks, profilers, and a war story
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.js
 
Promise: async programming hero
Promise: async programming heroPromise: async programming hero
Promise: async programming hero
 
An Introduction to Go
An Introduction to GoAn Introduction to Go
An Introduction to Go
 
PWA 與 Service Worker
PWA 與 Service WorkerPWA 與 Service Worker
PWA 與 Service Worker
 
Node.js
Node.jsNode.js
Node.js
 
Javascript Everywhere
Javascript EverywhereJavascript Everywhere
Javascript Everywhere
 
Aplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e JetpackAplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e Jetpack
 
Douglas Crockford: Serversideness
Douglas Crockford: ServersidenessDouglas Crockford: Serversideness
Douglas Crockford: Serversideness
 
JS Event Loop
JS Event LoopJS Event Loop
JS Event Loop
 
Async programming and python
Async programming and pythonAsync programming and python
Async programming and python
 

Recently uploaded

Call Girls Narol 7397865700 Independent Call Girls
Call Girls Narol 7397865700 Independent Call GirlsCall Girls Narol 7397865700 Independent Call Girls
Call Girls Narol 7397865700 Independent Call Girlsssuser7cb4ff
 
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptxDecoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptxJoão Esperancinha
 
Introduction-To-Agricultural-Surveillance-Rover.pptx
Introduction-To-Agricultural-Surveillance-Rover.pptxIntroduction-To-Agricultural-Surveillance-Rover.pptx
Introduction-To-Agricultural-Surveillance-Rover.pptxk795866
 
chaitra-1.pptx fake news detection using machine learning
chaitra-1.pptx  fake news detection using machine learningchaitra-1.pptx  fake news detection using machine learning
chaitra-1.pptx fake news detection using machine learningmisbanausheenparvam
 
Introduction to Microprocesso programming and interfacing.pptx
Introduction to Microprocesso programming and interfacing.pptxIntroduction to Microprocesso programming and interfacing.pptx
Introduction to Microprocesso programming and interfacing.pptxvipinkmenon1
 
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...Soham Mondal
 
Oxy acetylene welding presentation note.
Oxy acetylene welding presentation note.Oxy acetylene welding presentation note.
Oxy acetylene welding presentation note.eptoze12
 
HARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IVHARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IVRajaP95
 
Current Transformer Drawing and GTP for MSETCL
Current Transformer Drawing and GTP for MSETCLCurrent Transformer Drawing and GTP for MSETCL
Current Transformer Drawing and GTP for MSETCLDeelipZope
 
VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...
VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...
VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...VICTOR MAESTRE RAMIREZ
 
main PPT.pptx of girls hostel security using rfid
main PPT.pptx of girls hostel security using rfidmain PPT.pptx of girls hostel security using rfid
main PPT.pptx of girls hostel security using rfidNikhilNagaraju
 
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130Suhani Kapoor
 
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort serviceGurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort servicejennyeacort
 
Study on Air-Water & Water-Water Heat Exchange in a Finned Tube Exchanger
Study on Air-Water & Water-Water Heat Exchange in a Finned Tube ExchangerStudy on Air-Water & Water-Water Heat Exchange in a Finned Tube Exchanger
Study on Air-Water & Water-Water Heat Exchange in a Finned Tube ExchangerAnamika Sarkar
 
Biology for Computer Engineers Course Handout.pptx
Biology for Computer Engineers Course Handout.pptxBiology for Computer Engineers Course Handout.pptx
Biology for Computer Engineers Course Handout.pptxDeepakSakkari2
 

Recently uploaded (20)

Call Girls Narol 7397865700 Independent Call Girls
Call Girls Narol 7397865700 Independent Call GirlsCall Girls Narol 7397865700 Independent Call Girls
Call Girls Narol 7397865700 Independent Call Girls
 
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptxDecoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
Decoding Kotlin - Your guide to solving the mysterious in Kotlin.pptx
 
Introduction-To-Agricultural-Surveillance-Rover.pptx
Introduction-To-Agricultural-Surveillance-Rover.pptxIntroduction-To-Agricultural-Surveillance-Rover.pptx
Introduction-To-Agricultural-Surveillance-Rover.pptx
 
young call girls in Green Park🔝 9953056974 🔝 escort Service
young call girls in Green Park🔝 9953056974 🔝 escort Serviceyoung call girls in Green Park🔝 9953056974 🔝 escort Service
young call girls in Green Park🔝 9953056974 🔝 escort Service
 
chaitra-1.pptx fake news detection using machine learning
chaitra-1.pptx  fake news detection using machine learningchaitra-1.pptx  fake news detection using machine learning
chaitra-1.pptx fake news detection using machine learning
 
Introduction to Microprocesso programming and interfacing.pptx
Introduction to Microprocesso programming and interfacing.pptxIntroduction to Microprocesso programming and interfacing.pptx
Introduction to Microprocesso programming and interfacing.pptx
 
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
OSVC_Meta-Data based Simulation Automation to overcome Verification Challenge...
 
Oxy acetylene welding presentation note.
Oxy acetylene welding presentation note.Oxy acetylene welding presentation note.
Oxy acetylene welding presentation note.
 
🔝9953056974🔝!!-YOUNG call girls in Rajendra Nagar Escort rvice Shot 2000 nigh...
🔝9953056974🔝!!-YOUNG call girls in Rajendra Nagar Escort rvice Shot 2000 nigh...🔝9953056974🔝!!-YOUNG call girls in Rajendra Nagar Escort rvice Shot 2000 nigh...
🔝9953056974🔝!!-YOUNG call girls in Rajendra Nagar Escort rvice Shot 2000 nigh...
 
★ CALL US 9953330565 ( HOT Young Call Girls In Badarpur delhi NCR
★ CALL US 9953330565 ( HOT Young Call Girls In Badarpur delhi NCR★ CALL US 9953330565 ( HOT Young Call Girls In Badarpur delhi NCR
★ CALL US 9953330565 ( HOT Young Call Girls In Badarpur delhi NCR
 
HARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IVHARMONY IN THE NATURE AND EXISTENCE - Unit-IV
HARMONY IN THE NATURE AND EXISTENCE - Unit-IV
 
Current Transformer Drawing and GTP for MSETCL
Current Transformer Drawing and GTP for MSETCLCurrent Transformer Drawing and GTP for MSETCL
Current Transformer Drawing and GTP for MSETCL
 
Exploring_Network_Security_with_JA3_by_Rakesh Seal.pptx
Exploring_Network_Security_with_JA3_by_Rakesh Seal.pptxExploring_Network_Security_with_JA3_by_Rakesh Seal.pptx
Exploring_Network_Security_with_JA3_by_Rakesh Seal.pptx
 
VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...
VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...
VICTOR MAESTRE RAMIREZ - Planetary Defender on NASA's Double Asteroid Redirec...
 
main PPT.pptx of girls hostel security using rfid
main PPT.pptx of girls hostel security using rfidmain PPT.pptx of girls hostel security using rfid
main PPT.pptx of girls hostel security using rfid
 
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
VIP Call Girls Service Hitech City Hyderabad Call +91-8250192130
 
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort serviceGurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
Gurgaon ✡️9711147426✨Call In girls Gurgaon Sector 51 escort service
 
POWER SYSTEMS-1 Complete notes examples
POWER SYSTEMS-1 Complete notes  examplesPOWER SYSTEMS-1 Complete notes  examples
POWER SYSTEMS-1 Complete notes examples
 
Study on Air-Water & Water-Water Heat Exchange in a Finned Tube Exchanger
Study on Air-Water & Water-Water Heat Exchange in a Finned Tube ExchangerStudy on Air-Water & Water-Water Heat Exchange in a Finned Tube Exchanger
Study on Air-Water & Water-Water Heat Exchange in a Finned Tube Exchanger
 
Biology for Computer Engineers Course Handout.pptx
Biology for Computer Engineers Course Handout.pptxBiology for Computer Engineers Course Handout.pptx
Biology for Computer Engineers Course Handout.pptx
 

JavaScript Async for Effortless UX