SlideShare une entreprise Scribd logo
1  sur  25
Télécharger pour lire hors ligne
Nativní async/await
v Node.js
Už tam jsme??
Miroslav Bajtoš
Proč async/await?
it('creates a product in a category', function(done) {
Category.create({name: 'Food'}, function(err, cat) {
if (err) return done(err);
cat.products.create({name: 'Apple'}, function(err, prod) {
if (err) return done(err);
expect(prod).to.have.property('categoryId', cat.id);
done();
});
});
});
ES5 - důvěrné známe jistoty
it('creates a product in a category', function(done) {
Category.create({name: 'Food'}, function(err, cat) {
if (err) return done(err);
cat.products.create({name: 'Apple'}, function(err, prod) {
if (err) return done(err);
expect(prod).to.have.property('categoryId', cat.id);
done();
});
});
});
S červíkem pochybností
it('creates a product in a category', function(done) {
var cat;
async.waterfall([
function(next) {
Category.create({name: 'Food'}, next);
},
function(c, next) {
cat = c;
cat.products.create({name: 'Apple'}, next);
},
function(prod, next) {
expect(prod).to.have.property('categoryId', cat.id);
next();
}
], done);
});
ES5 - caolan/async
it('creates a product in a category', function() {
return Category.create({name: 'Food'}).then(cat => {
return cat.products.create({name: 'Apple'}).then(prod => {
expect(prod).to.have.property('categoryId', cat.id);
});
});
});
ES6/ES2015 - Promises
it('creates a product in a category', async function() {
const cat = await Category.create({name: 'Food'});
const prod = await cat.products.create({name: 'Apple'});
expect(prod).to.have.property('categoryId', cat.id);
});
ES2017 - async/await
function one() {
return Promise.resolve(1);
}
async function two() {
const i = await one();
return i+1;
}
two().then(n => console.log(n));
Snadné kombinování
Stav implementace v Node.js
Standardizace v ECMAScript
Leden 2014: začíná diskuse v TC39
Srpen 2015: stage 2 (“draft”)
Říjen 2015: stage 3 (“candidate”)
Říjen 2016: stage 4 (“finished”)
Node.js
Říjen 2016: Node.js 7.0.0 (V8 5.4)
$ node --harmony async-await.js
Únor 2017: Node.js 7.6.0 (V8 5.5)
$ node async-await.js
Duben 2017: Node.js 8.0.0-RC (V8 5.7)
výrazné zvýšení výkonu
async function two() {
const i = await one();
throw new Error('test');
}
Error: test
at two (err-stack.js:3:9)
at process._tickCallback (next_tick.js:109:7)
...
Stack trace - await
function two() {
return one().then(() => {
throw new Error('test');
});
}
Error: test
at one.then (err-stack.js:3:9)
at process._tickCallback (next_tick.js:109:7)
...
Stack trace - Promises
Výkon - Node.js 8.0.0-alpha
doxbee/sequential from bluebird
Výkon - Node.js 6.10.1 LTS
doxbee/sequential from bluebird
Starší verze tady budou ještě dlouho
https://github.com/nodejs/LTS
Interoperabilita s Bluebird
const Promise = require('bluebird');
const one = () => Promise.resolve(1);
one() instanceof Promise // true
const two = async () => await one() + 1;
two() instanceof Promise // false
Mé výhrady k transpilaci
- Složitější nastavení projektu
- Čekání na transpilátor - pomalejší TDD
- Stack traces z transpilovaného kódu
- Ztráta vychytávek nativní verze await
Kdy přejít na async/await (nativně)
- Můžete vyžadovat Node.js 8+
- Výkon kódu není kritický
- Stačí vám ES6 Promise API
(bez rozšíření Bluebird)
Jak transpilovat
// .babelrc
{"plugins": [
["fast-async", {
"compiler": {
"promises": true,
"noRuntime": true,
"es6target": true,
"wrapAwait": false
}}]]}
babel + fast-async
// tsconfig.json
{
"compilerOptions": {
"lib": ["es6"],
"target": "es5" // Node.js 4+
"target": "es2015" // Node.js 6+
},
// ...
}
TypeScript
Co na to Java?
Icon made by Freepik from www.flaticon.com
Děkuji za pozornost!
Email: miro.bajtos@gmail.com
Twitter: @bajtos
GitHub: @bajtos
LinkedIn: bajtos

Contenu connexe

Similaire à Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?

Lex Vjatkin + Ondřej procházka: Jak to děláme ve Wikidi
Lex Vjatkin + Ondřej procházka: Jak to děláme ve WikidiLex Vjatkin + Ondřej procházka: Jak to děláme ve Wikidi
Lex Vjatkin + Ondřej procházka: Jak to děláme ve Wikidi
Develcz
 
Testování presenterů v Nette
Testování presenterů v NetteTestování presenterů v Nette
Testování presenterů v Nette
Taste Medio
 

Similaire à Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme? (20)

ASP.NET 3.5 / futures
ASP.NET 3.5 / futuresASP.NET 3.5 / futures
ASP.NET 3.5 / futures
 
Rozšiřujeme jQuery aneb proč si nenapsat plugin?
Rozšiřujeme jQuery aneb proč si nenapsat plugin?Rozšiřujeme jQuery aneb proč si nenapsat plugin?
Rozšiřujeme jQuery aneb proč si nenapsat plugin?
 
Doctrine ORM & model
Doctrine ORM & modelDoctrine ORM & model
Doctrine ORM & model
 
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
 
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
 
Drupal Front-end
Drupal Front-endDrupal Front-end
Drupal Front-end
 
Jak přemigrovat Slevomat na Doctrine za jedno dopoledne
Jak přemigrovat Slevomat na Doctrine za jedno dopoledneJak přemigrovat Slevomat na Doctrine za jedno dopoledne
Jak přemigrovat Slevomat na Doctrine za jedno dopoledne
 
201502.ReinIT.Dev
201502.ReinIT.Dev201502.ReinIT.Dev
201502.ReinIT.Dev
 
MoroSystems na ostravském CZJUGu o Apache Wicket
MoroSystems na ostravském CZJUGu o Apache WicketMoroSystems na ostravském CZJUGu o Apache Wicket
MoroSystems na ostravském CZJUGu o Apache Wicket
 
Petr Heinz - Čisté testy, dobré testy
Petr Heinz - Čisté testy, dobré testyPetr Heinz - Čisté testy, dobré testy
Petr Heinz - Čisté testy, dobré testy
 
Lex Vjatkin + Ondřej procházka: Jak to děláme ve Wikidi
Lex Vjatkin + Ondřej procházka: Jak to děláme ve WikidiLex Vjatkin + Ondřej procházka: Jak to děláme ve Wikidi
Lex Vjatkin + Ondřej procházka: Jak to děláme ve Wikidi
 
Deployment prakticky
Deployment praktickyDeployment prakticky
Deployment prakticky
 
Kdyby/Events
Kdyby/EventsKdyby/Events
Kdyby/Events
 
Kdyby/Events #posobota
Kdyby/Events #posobotaKdyby/Events #posobota
Kdyby/Events #posobota
 
Testování presenterů v Nette
Testování presenterů v NetteTestování presenterů v Nette
Testování presenterů v Nette
 
ClojureScript
ClojureScriptClojureScript
ClojureScript
 
Django
DjangoDjango
Django
 
Continuous Integration
Continuous IntegrationContinuous Integration
Continuous Integration
 
Clean code
Clean codeClean code
Clean code
 
Android Development for Phone and Tablet
Android Development for Phone and TabletAndroid Development for Phone and Tablet
Android Development for Phone and Tablet
 

Plus de Develcz

Martin Hassman: Jak se tvoří addony pro World of Warcraft
Martin Hassman: Jak se tvoří addony pro World of WarcraftMartin Hassman: Jak se tvoří addony pro World of Warcraft
Martin Hassman: Jak se tvoří addony pro World of Warcraft
Develcz
 

Plus de Develcz (20)

Daniel Steigerwald: WYSIWYG je šik! (když funguje)
Daniel Steigerwald: WYSIWYG je šik! (když funguje)Daniel Steigerwald: WYSIWYG je šik! (když funguje)
Daniel Steigerwald: WYSIWYG je šik! (když funguje)
 
Ondřej Hlaváček: Životní cyklus featury
Ondřej Hlaváček: Životní cyklus featuryOndřej Hlaváček: Životní cyklus featury
Ondřej Hlaváček: Životní cyklus featury
 
Martin Hassman: Jak se tvoří addony pro World of Warcraft
Martin Hassman: Jak se tvoří addony pro World of WarcraftMartin Hassman: Jak se tvoří addony pro World of Warcraft
Martin Hassman: Jak se tvoří addony pro World of Warcraft
 
Ondřej Voves: Jak přepsat monolit do mikroslužeb
Ondřej Voves: Jak přepsat monolit do mikroslužebOndřej Voves: Jak přepsat monolit do mikroslužeb
Ondřej Voves: Jak přepsat monolit do mikroslužeb
 
Marcel Šulek: Zpraste svoje kódy
Marcel Šulek: Zpraste svoje kódyMarcel Šulek: Zpraste svoje kódy
Marcel Šulek: Zpraste svoje kódy
 
Michal Illich: Vývojáři staví letadlo
Michal Illich: Vývojáři staví letadloMichal Illich: Vývojáři staví letadlo
Michal Illich: Vývojáři staví letadlo
 
Ondřej Kokeš: Zpracování dat z veřejných zdrojů
Ondřej Kokeš: Zpracování dat z veřejných zdrojůOndřej Kokeš: Zpracování dat z veřejných zdrojů
Ondřej Kokeš: Zpracování dat z veřejných zdrojů
 
Patrick Zandl: Open source software, hardware, 3D tiskárny a tvrdý business -...
Patrick Zandl: Open source software, hardware, 3D tiskárny a tvrdý business -...Patrick Zandl: Open source software, hardware, 3D tiskárny a tvrdý business -...
Patrick Zandl: Open source software, hardware, 3D tiskárny a tvrdý business -...
 
Štěpán Bechynský: Hardware pro IoT projekty nejen pro hobby, ale i pro průmysl
Štěpán Bechynský: Hardware pro IoT projekty nejen pro hobby, ale i pro průmyslŠtěpán Bechynský: Hardware pro IoT projekty nejen pro hobby, ale i pro průmysl
Štěpán Bechynský: Hardware pro IoT projekty nejen pro hobby, ale i pro průmysl
 
Tomáš Vondra: Paralelizace dotazu a partitioning v PostgreSQL
Tomáš Vondra: Paralelizace dotazu a partitioning v PostgreSQLTomáš Vondra: Paralelizace dotazu a partitioning v PostgreSQL
Tomáš Vondra: Paralelizace dotazu a partitioning v PostgreSQL
 
Tomáš Zvěřina: Flutter.io - multiplatformní vývoj mobilních aplikací
Tomáš Zvěřina: Flutter.io - multiplatformní vývoj mobilních aplikacíTomáš Zvěřina: Flutter.io - multiplatformní vývoj mobilních aplikací
Tomáš Zvěřina: Flutter.io - multiplatformní vývoj mobilních aplikací
 
Jakub Vrána: Dokazatelná bezpečnost
Jakub Vrána: Dokazatelná bezpečnostJakub Vrána: Dokazatelná bezpečnost
Jakub Vrána: Dokazatelná bezpečnost
 
Roman Schejbal: From Madness To Reason
Roman Schejbal: From Madness To ReasonRoman Schejbal: From Madness To Reason
Roman Schejbal: From Madness To Reason
 
Michal Illich: Zuri aneb Vývojáři staví letadlo
Michal Illich: Zuri aneb Vývojáři staví letadloMichal Illich: Zuri aneb Vývojáři staví letadlo
Michal Illich: Zuri aneb Vývojáři staví letadlo
 
Ondřej Šika: Docker, Traefik a CI - Mějte nasazené všeny větve na kterých pra...
Ondřej Šika: Docker, Traefik a CI - Mějte nasazené všeny větve na kterých pra...Ondřej Šika: Docker, Traefik a CI - Mějte nasazené všeny větve na kterých pra...
Ondřej Šika: Docker, Traefik a CI - Mějte nasazené všeny větve na kterých pra...
 
David Majda: Autoformátování kódu
David Majda: Autoformátování kóduDavid Majda: Autoformátování kódu
David Majda: Autoformátování kódu
 
David Grudl: Open source: The Good, the Bad and the Ugly
David Grudl: Open source: The Good, the Bad and the UglyDavid Grudl: Open source: The Good, the Bad and the Ugly
David Grudl: Open source: The Good, the Bad and the Ugly
 
Ondřej Machulda: Začíná zlatá doba end-to-end testů!
Ondřej Machulda: Začíná zlatá doba end-to-end testů!Ondřej Machulda: Začíná zlatá doba end-to-end testů!
Ondřej Machulda: Začíná zlatá doba end-to-end testů!
 
Adam Kudrna: Headless WordPress/Drupal
Adam Kudrna: Headless WordPress/DrupalAdam Kudrna: Headless WordPress/Drupal
Adam Kudrna: Headless WordPress/Drupal
 
Jaroslav Tulach: GraalVM - z vývoje nejrychlejšího virtuálního stroje na světě
Jaroslav Tulach: GraalVM - z vývoje nejrychlejšího virtuálního stroje na světěJaroslav Tulach: GraalVM - z vývoje nejrychlejšího virtuálního stroje na světě
Jaroslav Tulach: GraalVM - z vývoje nejrychlejšího virtuálního stroje na světě
 

Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?

  • 1. Nativní async/await v Node.js Už tam jsme?? Miroslav Bajtoš
  • 3. it('creates a product in a category', function(done) { Category.create({name: 'Food'}, function(err, cat) { if (err) return done(err); cat.products.create({name: 'Apple'}, function(err, prod) { if (err) return done(err); expect(prod).to.have.property('categoryId', cat.id); done(); }); }); }); ES5 - důvěrné známe jistoty
  • 4. it('creates a product in a category', function(done) { Category.create({name: 'Food'}, function(err, cat) { if (err) return done(err); cat.products.create({name: 'Apple'}, function(err, prod) { if (err) return done(err); expect(prod).to.have.property('categoryId', cat.id); done(); }); }); }); S červíkem pochybností
  • 5.
  • 6. it('creates a product in a category', function(done) { var cat; async.waterfall([ function(next) { Category.create({name: 'Food'}, next); }, function(c, next) { cat = c; cat.products.create({name: 'Apple'}, next); }, function(prod, next) { expect(prod).to.have.property('categoryId', cat.id); next(); } ], done); }); ES5 - caolan/async
  • 7. it('creates a product in a category', function() { return Category.create({name: 'Food'}).then(cat => { return cat.products.create({name: 'Apple'}).then(prod => { expect(prod).to.have.property('categoryId', cat.id); }); }); }); ES6/ES2015 - Promises
  • 8. it('creates a product in a category', async function() { const cat = await Category.create({name: 'Food'}); const prod = await cat.products.create({name: 'Apple'}); expect(prod).to.have.property('categoryId', cat.id); }); ES2017 - async/await
  • 9. function one() { return Promise.resolve(1); } async function two() { const i = await one(); return i+1; } two().then(n => console.log(n)); Snadné kombinování
  • 11. Standardizace v ECMAScript Leden 2014: začíná diskuse v TC39 Srpen 2015: stage 2 (“draft”) Říjen 2015: stage 3 (“candidate”) Říjen 2016: stage 4 (“finished”)
  • 12. Node.js Říjen 2016: Node.js 7.0.0 (V8 5.4) $ node --harmony async-await.js Únor 2017: Node.js 7.6.0 (V8 5.5) $ node async-await.js Duben 2017: Node.js 8.0.0-RC (V8 5.7) výrazné zvýšení výkonu
  • 13. async function two() { const i = await one(); throw new Error('test'); } Error: test at two (err-stack.js:3:9) at process._tickCallback (next_tick.js:109:7) ... Stack trace - await
  • 14. function two() { return one().then(() => { throw new Error('test'); }); } Error: test at one.then (err-stack.js:3:9) at process._tickCallback (next_tick.js:109:7) ... Stack trace - Promises
  • 15. Výkon - Node.js 8.0.0-alpha doxbee/sequential from bluebird
  • 16. Výkon - Node.js 6.10.1 LTS doxbee/sequential from bluebird
  • 17. Starší verze tady budou ještě dlouho https://github.com/nodejs/LTS
  • 18. Interoperabilita s Bluebird const Promise = require('bluebird'); const one = () => Promise.resolve(1); one() instanceof Promise // true const two = async () => await one() + 1; two() instanceof Promise // false
  • 19. Mé výhrady k transpilaci - Složitější nastavení projektu - Čekání na transpilátor - pomalejší TDD - Stack traces z transpilovaného kódu - Ztráta vychytávek nativní verze await
  • 20. Kdy přejít na async/await (nativně) - Můžete vyžadovat Node.js 8+ - Výkon kódu není kritický - Stačí vám ES6 Promise API (bez rozšíření Bluebird)
  • 22. // .babelrc {"plugins": [ ["fast-async", { "compiler": { "promises": true, "noRuntime": true, "es6target": true, "wrapAwait": false }}]]} babel + fast-async
  • 23. // tsconfig.json { "compilerOptions": { "lib": ["es6"], "target": "es5" // Node.js 4+ "target": "es2015" // Node.js 6+ }, // ... } TypeScript
  • 24. Co na to Java? Icon made by Freepik from www.flaticon.com
  • 25. Děkuji za pozornost! Email: miro.bajtos@gmail.com Twitter: @bajtos GitHub: @bajtos LinkedIn: bajtos