Top Banner
ASYNC ALL AROUND US FRANCISCO MS FERREIRA @fmsf303
45

Async all around us (promises)

May 31, 2015

Download

Technology

25 min tech talk around javascript promises and futures
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Async all around us (promises)

ASYNC ALL AROUND USFRANCISCO MS FERREIRA

@fmsf303

Page 2: Async all around us (promises)

JSPromises

Page 3: Async all around us (promises)

JavaCompletable

Futures

JSPromises

Page 4: Async all around us (promises)

DartFutures

JavaCompletable

Futures

JSPromises

Page 5: Async all around us (promises)

Async

COMMONPROBLEM

Page 6: Async all around us (promises)
Page 7: Async all around us (promises)

exports.saveWeekAvailability = function(req, res){ console.log("-- SAVE WEEK AVAILABILITY --"); weekData = req.body; var resultArr = []; for (var i=0; i< weekData.length; i++) { resultArr[i] = Availability(weekData[i]).save(function(err, result){ return result; }); } console.log("-- Result Arr --"); console.log(resultArr); };

MY CODE DOESN’T WORK

Page 8: Async all around us (promises)

resultArr[i] = Availability(weekData[i]).save(function(err, result){ return result; });

MY CODE DOESN’T WORK

Page 9: Async all around us (promises)

MY CODE DOESN’T WORK

router.get('/about', function(req, res) {

var animalsData = sequelize.query("SELECT * FROM animals").success(function(rows) { return rows; }); console.log(animals); // returns 'undefined'

var humansData = sequelize.query("SELECT * FROM humans").success(function(rows) { return rows; }); console.log(humans); // returns 'undefined'

res.render('about', { animals: animalsData, humans: humansData });});

Page 10: Async all around us (promises)

PYRAMID OF DOOM

router.get('/about', function(req, res) {

sequelize.query("SELECT * FROM animals").success( function( animals ) { sequelize.query("SELECT * FROM humans").success( function( humans ) { res.render('about', { animals: animalsData, humans: humansData }); }); }); });

Page 11: Async all around us (promises)
Page 12: Async all around us (promises)
Page 13: Async all around us (promises)

JAVA

public CompletableFuture<String> ask() { final CompletableFuture<String> future = new CompletableFuture<>(); //... return future;}

Page 14: Async all around us (promises)

JAVA

public CompletableFuture<String> ask() { final CompletableFuture<String> future = new CompletableFuture<>(); //... return future;}

future.complete("42");

Page 15: Async all around us (promises)

JAVA

public CompletableFuture<String> ask() { final CompletableFuture<String> future = new CompletableFuture<>(); //... return future;}

future.complete("42");

future.get(); // this will block execution

Page 16: Async all around us (promises)

DART

void printDailyNewsDigest() { File file = new File("dailyNewsDigest.txt"); Future future = file.readAsString(); future.then((content) { print(content); });}

Page 17: Async all around us (promises)

DART

Future<Item> getItem(){ var completer = new Completer();

// At some time you need to complete the future: completer.complete(new Item());

return completer.future;}

Page 18: Async all around us (promises)

PROMISES

this.updateEmailsInDatabase = function() { var fetchEmailDeferer = Q.defer();

inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done();

return fetchEmailDeferer.promise; };

Page 19: Async all around us (promises)

PROMISES

this.updateEmailsInDatabase = function() { var fetchEmailDeferer = Q.defer();

inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done();

return fetchEmailDeferer.promise; };

Page 20: Async all around us (promises)

PROMISES

this.updateEmailsInDatabase = function() { var fetchEmailDeferer = Q.defer();

inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done();

return fetchEmailDeferer.promise; };

Page 21: Async all around us (promises)

PROMISES

this.updateEmailsInDatabase = function() { var fetchEmailDeferer = Q.defer();

inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done();

return fetchEmailDeferer.promise; };

Page 22: Async all around us (promises)

PROMISES

this.updateEmailsInDatabase = function() { var fetchEmailDeferer = Q.defer();

inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done();

return fetchEmailDeferer.promise; };

Page 23: Async all around us (promises)

PROMISES

this.updateEmailsInDatabase = function() { var fetchEmailDeferer = Q.defer();

inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done();

return fetchEmailDeferer.promise; };

Page 24: Async all around us (promises)

PROMISES

this.updateEmailsInDatabase = function() { var fetchEmailDeferer = Q.defer();

inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done();

return fetchEmailDeferer.promise; };

Page 25: Async all around us (promises)

PROMISES

this.updateEmailsInDatabase = function() { var fetchEmailDeferer = Q.defer();

inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done();

return fetchEmailDeferer.promise; };

Page 26: Async all around us (promises)

WHAT IS A PROMISE?- Like a future

- I promise that I will resolve a value

Page 27: Async all around us (promises)

WHAT IS A PROMISE?- Like a future

- I promise that I will resolve a value- function fooBar() {

- …;- return promise;

- }

Page 28: Async all around us (promises)

WHAT IS A PROMISE?- Like a future

- I promise that I will resolve a value- function fooBar() {

- var deferer = Q.defer()- functionWithACallback( function( aValue) {

- deferer.resolve( aValue );- }- return defer.promise;

- }

- var promise = fooBar();

Page 29: Async all around us (promises)

WHAT IS A PROMISE?- Like a future

- I promise that I will resolve a value- function fooBar() {

- var deferer = Q.defer()- functionWithACallback( function( aValue) {

- deferer.resolve( aValue );- }- return defer.promise;

- }

- var promise = fooBar();

Page 30: Async all around us (promises)

WHAT IS A PROMISE?- Like a future

- I promise that I will resolve a value- function fooBar() {

- var deferer = Q.defer()- functionWithACallback( function( aValue) {

- deferer.resolve( aValue );- }- return defer.promise;

- }

- var promise = fooBar();- promise.then( function( value ) {

- console.log( “myValue:”, value );- });

Page 31: Async all around us (promises)

ARGUMENTS

Page 32: Async all around us (promises)

ARGUMENT FLOW

inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done();

Page 33: Async all around us (promises)

ARGUMENT FLOW

inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done();

Page 34: Async all around us (promises)

BI-DIRECTIONAL ARGUMENTS

Page 35: Async all around us (promises)

BI-DIRECTIONAL ARGUMENTS

databasePromise

.then( openCollection( dbconfig.getUsersCollectionName() ) )

.then( insert(user) )

.then( addUserDeferer.resolve )

.done();

Page 36: Async all around us (promises)

BI-DIRECTIONALARGUMENTS

databasePromise

.then( openCollection( dbconfig.getUsersCollectionName() ) )

.then( insert(user) )

.then( addUserDeferer.resolve )

.done();

Page 37: Async all around us (promises)

BI-DIRECTIONAL ARGUMENTS

//.then( openCollection( dbconfig.getUsersCollectionName() ) )

function openCollection( colectionToOpen ) {

return function(db) {

return db.collection( colectionToOpen );

};

}

Page 38: Async all around us (promises)

BI-DIRECTIONAL ARGUMENTS

//.then( openCollection( dbconfig.getUsersCollectionName() ) )

function openCollection( colectionToOpen ) {

return function(db) {

return db.collection( colectionToOpen );

};

}

Page 39: Async all around us (promises)

BI-DIRECTIONAL ARGUMENTS

//.then( openCollection( dbconfig.getUsersCollectionName() ) )

function openCollection( colectionToOpen ) {

return function(db) {

return db.collection( colectionToOpen );

};

}

Page 40: Async all around us (promises)
Page 41: Async all around us (promises)

TEST YOUR STUFF!

Page 42: Async all around us (promises)

PLEASETEST YOUR STUFF!

Page 43: Async all around us (promises)

UNIT TESTS IMPACT IN JS

inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally )

it('should be able to list messages', function( done ) { inboxHandler.listMessages( 2 ).then( function( messages ) { messages.should.have.length( 2 ); }).done( done ); });

Page 44: Async all around us (promises)

READABLE & MAINTAINABLE

inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done();

Page 45: Async all around us (promises)

QUESTIONS

?http://j.rfer.us/EBRJimk0X