async all around us (promises)

Post on 31-May-2015

274 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

25 min tech talk around javascript promises and futures

TRANSCRIPT

ASYNC ALL AROUND USFRANCISCO MS FERREIRA

@fmsf303

JSPromises

JavaCompletable

Futures

JSPromises

DartFutures

JavaCompletable

Futures

JSPromises

Async

COMMONPROBLEM

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

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

MY CODE DOESN’T WORK

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 });});

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 }); }); }); });

JAVA

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

JAVA

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

future.complete("42");

JAVA

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

future.complete("42");

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

DART

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

DART

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

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

return completer.future;}

PROMISES

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

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

return fetchEmailDeferer.promise; };

PROMISES

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

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

return fetchEmailDeferer.promise; };

PROMISES

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

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

return fetchEmailDeferer.promise; };

PROMISES

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

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

return fetchEmailDeferer.promise; };

PROMISES

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

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

return fetchEmailDeferer.promise; };

PROMISES

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

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

return fetchEmailDeferer.promise; };

PROMISES

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

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

return fetchEmailDeferer.promise; };

PROMISES

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

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

return fetchEmailDeferer.promise; };

WHAT IS A PROMISE?- Like a future

- I promise that I will resolve a value

WHAT IS A PROMISE?- Like a future

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

- …;- return promise;

- }

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();

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();

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 );- });

ARGUMENTS

ARGUMENT FLOW

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

ARGUMENT FLOW

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

BI-DIRECTIONAL ARGUMENTS

BI-DIRECTIONAL ARGUMENTS

databasePromise

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

.then( insert(user) )

.then( addUserDeferer.resolve )

.done();

BI-DIRECTIONALARGUMENTS

databasePromise

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

.then( insert(user) )

.then( addUserDeferer.resolve )

.done();

BI-DIRECTIONAL ARGUMENTS

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

function openCollection( colectionToOpen ) {

return function(db) {

return db.collection( colectionToOpen );

};

}

BI-DIRECTIONAL ARGUMENTS

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

function openCollection( colectionToOpen ) {

return function(db) {

return db.collection( colectionToOpen );

};

}

BI-DIRECTIONAL ARGUMENTS

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

function openCollection( colectionToOpen ) {

return function(db) {

return db.collection( colectionToOpen );

};

}

TEST YOUR STUFF!

PLEASETEST YOUR STUFF!

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 ); });

READABLE & MAINTAINABLE

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

QUESTIONS

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

top related