The Evolution of Asynchronous Javascript - Alessandro Cinelli - Codemotion Milan 2016
-
Upload
codemotion -
Category
Technology
-
view
240 -
download
1
Transcript of The Evolution of Asynchronous Javascript - Alessandro Cinelli - Codemotion Milan 2016
the core of asynchronous programming is the relationship between
the now and later parts of your program
ASYNCRONY
A JS runtime contains a message queue, which is a list of messages to be processed.
To each message is associated a function.
QUEUE
A JS runtime contains a message queue, which is a list of messages to be processed.
To each message is associated a function.
When the stack is empty, a message is taken out of the queue and processed.
QUEUE
JS unlike a lot of other languages, never blocks
Handling I/O is typically performed via events and callbacks
When the application is waiting for an IndexedDB query to return or an XHR request to return, it can still process other things like user input
JS IS NON BLOCKING
Node.js is great for Input/Output processing but not optimised for CPU-bound work like performing a large amount of calculations.
JS IS NON BLOCKING
Up until recently (ES2015), JS itself has actually
never had any direct notion of asynchrony built into it
most devs new to JS have issues with the fact that later doesn’t happen strictly and immediately after now
ASYNCRONY
SEQUENTIAL BRAIN
put aside involuntary, subconscious, automatic brain functions
we are not multitasker
INVERSION OF CONTROL
what if it’s never called?
what if it’s called too early?
what if it’s called too late?
Callbacks are the fundamental unit of asynchrony in JS.
But they’re not enough for the evolving landscape of async programming as JS
matures.
I <3 callbacks
PROMISES
It allows you to associate handlers to an asynchronous action's eventual success value or
failure reason.
A promise represents a proxy for a value not necessarily known when the promise is created.
PROMISES
It allows you to associate handlers to an asynchronous action's eventual success value or
failure reason.
This lets asynchronous methods return values like synchronous methods: instead of the final value,
the asynchronous method returns a promise.
A promise represents a proxy for a value not necessarily known when the promise is created.
PROMISES
http://ecma-international.org/ecma-262/6.0/#sec-jobs-and-job-queues
PROMISESpending: initial state, not fulfilled or rejected
fulfilled: the operation completed successfully
rejected: meaning that the operation failed
settled: has fulfilled or rejected
PERFORMANCES
Promises are slower compared to callbacks
You don’t get rid of callbacks, they just orchestrate callbacks in a trustable way
PERFORMANCES
Promises are slower compared to callbacks
You don’t get rid of callbacks, they just orchestrate callbacks in a trustable way99.9% of the time you
won’t feel it
GENERATORS1 constructing the iterator, not executing
2 starts the iterator
4 resume the iterator
3 pause the iterator
GENERATORS1 constructing the iterator, not executing
2 starts the iterator
4 resume the iterator
3 pause the iterator
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)
GENERATORS + PROMISES
npm install -g babel-cli
babel awesome_code.es2017 -o awesome_code.js
node awesome_code.js
//add it either to .babelrc or package.json{ "plugins": ["transform-async-to-generator"]}
npm install babel-plugin-transform-async-to-generator