SlideShare a Scribd company logo
ASYNC ALL 
AROUND US 
FRANCISCO MS FERREIRA 
@fmsf303
JS 
Promises
Java 
Completable 
Futures 
JS 
Promises
Dart 
Futures 
Java 
Completable 
Futures 
JS 
Promises
Async 
COMMON 
PROBLEM
Async all around us (promises)
MY CODE DOESN’T WORK 
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 
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 }); 
}); 
}); 
});
Async all around us (promises)
Async all around us (promises)
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(); 
messages 
listMessages saveMessagesFromEmailServerLocally
ARGUMENT FLOW 
inboxHandler 
.listMessages() 
.then( saveMessagesFromEmailServerLocally ) 
.then( fetchEmailDeferer.resolve ) 
.done(); 
listMessages saveMessagesFromEmailServerLocally 
fetchEmailDeferer.resolve 
messages 
success
BI-DIRECTIONAL 
ARGUMENTS
BI-DIRECTIONAL 
ARGUMENTS 
databasePromise 
.then( openCollection( dbconfig.getUsersCollectionName() ) ) 
.then( insert(user) ) 
.then( addUserDeferer.resolve ) 
.done();
BI-DIRECTIONAL 
ARGUMENTS 
databasePromise 
.then( openCollection( dbconfig.getUsersCollectionName() ) ) 
.then( insert(user) ) 
.then( addUserDeferer.resolve ) 
.done(); 
databasePromise 
openCollection 
getCollection 
database 
db collection
BI-DIRECTIONAL 
ARGUMENTS 
//.then( openCollection( dbconfig.getUsersCollectionName() ) ) 
function openCollection( colectionToOpen ) { 
return function(db) { 
return db.collection( colectionToOpen ); 
}; 
} 
databasePromise 
openCollection 
getCollection 
database 
db collection
BI-DIRECTIONAL 
ARGUMENTS 
//.then( openCollection( dbconfig.getUsersCollectionName() ) ) 
function openCollection( colectionToOpen ) { 
return function(db) { 
return db.collection( colectionToOpen ); 
}; 
} 
databasePromise 
openCollection 
getCollection 
database 
db collection
BI-DIRECTIONAL 
ARGUMENTS 
//.then( openCollection( dbconfig.getUsersCollectionName() ) ) 
function openCollection( colectionToOpen ) { 
return function(db) { 
return db.collection( colectionToOpen ); 
}; 
} 
databasePromise 
openCollection 
getCollection 
database 
db collection
Async all around us (promises)
TEST YOUR STUFF!
PLEASE 
TEST 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

More Related Content

PDF
Python Ireland Nov 2010 Talk: Unit Testing
PDF
Models and Service Layers, Hemoglobin and Hobgoblins
PPTX
Indeed My Jobs: A case study in ReactJS and Redux (Meetup talk March 2016)
PDF
Things I Believe Now That I'm Old
PDF
Command Bus To Awesome Town
PPTX
Swing database(mysql)
PDF
Java: Nie popełniaj tych błędów!
KEY
CoffeeScript - A Rubyist's Love Affair
Python Ireland Nov 2010 Talk: Unit Testing
Models and Service Layers, Hemoglobin and Hobgoblins
Indeed My Jobs: A case study in ReactJS and Redux (Meetup talk March 2016)
Things I Believe Now That I'm Old
Command Bus To Awesome Town
Swing database(mysql)
Java: Nie popełniaj tych błędów!
CoffeeScript - A Rubyist's Love Affair

What's hot (20)

PDF
Building Smart Async Functions For Mobile
PDF
Future of HTTP in CakePHP
PPTX
Unit testing powershell
PDF
Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011
PDF
PHP 5.3 and Lithium: the most rad php framework
TXT
Manage catalog Configueation In Sharepoint PowerShell
PDF
The History of PHPersistence
PDF
Everything About PowerShell
PDF
Database Design Patterns
RTF
ABV_fastcontact
PDF
Agile database access with CakePHP 3
PDF
Beyond the DOM: Sane Structure for JS Apps
PDF
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
PPTX
Better Together: Microsoft Azure Virtual Machines & PowerShell Desired State ...
PDF
New in cakephp3
PDF
State of the CFEngine 2018
DOCX
Update&delete
PDF
Programming with Python and PostgreSQL
PDF
Internationalizing CakePHP Applications
PDF
Selenium cheat sheet
Building Smart Async Functions For Mobile
Future of HTTP in CakePHP
Unit testing powershell
Be lazy, be ESI: HTTP caching and Symfony2 @ PHPDay 2011 05-13-2011
PHP 5.3 and Lithium: the most rad php framework
Manage catalog Configueation In Sharepoint PowerShell
The History of PHPersistence
Everything About PowerShell
Database Design Patterns
ABV_fastcontact
Agile database access with CakePHP 3
Beyond the DOM: Sane Structure for JS Apps
Dutch PHP Conference - PHPSpec 2 - The only Design Tool you need
Better Together: Microsoft Azure Virtual Machines & PowerShell Desired State ...
New in cakephp3
State of the CFEngine 2018
Update&delete
Programming with Python and PostgreSQL
Internationalizing CakePHP Applications
Selenium cheat sheet
Ad

Similar to Async all around us (promises) (20)

PPT
You promise?
PPTX
Understanding Async/Await in Javascript
PDF
Asynchronous Programming. Talk from ESUG2024
PDF
Promises, Promises: Mastering Async I/O in Javascript with the Promise Pattern
PDF
Promises are so passé - Tim Perry - Codemotion Milan 2016
PPTX
Avoiding callback hell in Node js using promises
PPTX
Async discussion 9_29_15
PDF
Promises look into the async future
PDF
Getting Comfortable with JS Promises
PDF
Boom! Promises/A+ Was Born
PDF
Asynchronous development in JavaScript
PDF
JavaScript Promises Simplified [Free Meetup]
PDF
Asynchronous JavaScript Programming with Callbacks & Promises
PDF
Javascript Promises
PPTX
Deferred object
PDF
JavaScript - Promises study notes- 2019-11-30
PDF
Introduction to Node JS2.pdf
PPTX
Mobile Application Development class 008
PPTX
asyncjavascript.pptxdgdsgdffgfdgfgfgfdgfdgf
ZIP
Promises in JavaScript with jQuery
You promise?
Understanding Async/Await in Javascript
Asynchronous Programming. Talk from ESUG2024
Promises, Promises: Mastering Async I/O in Javascript with the Promise Pattern
Promises are so passé - Tim Perry - Codemotion Milan 2016
Avoiding callback hell in Node js using promises
Async discussion 9_29_15
Promises look into the async future
Getting Comfortable with JS Promises
Boom! Promises/A+ Was Born
Asynchronous development in JavaScript
JavaScript Promises Simplified [Free Meetup]
Asynchronous JavaScript Programming with Callbacks & Promises
Javascript Promises
Deferred object
JavaScript - Promises study notes- 2019-11-30
Introduction to Node JS2.pdf
Mobile Application Development class 008
asyncjavascript.pptxdgdsgdffgfdgfgfgfdgfdgf
Promises in JavaScript with jQuery
Ad

Recently uploaded (20)

PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Network Security Unit 5.pdf for BCA BBA.
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
sap open course for s4hana steps from ECC to s4
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Empathic Computing: Creating Shared Understanding
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Electronic commerce courselecture one. Pdf
PPTX
Cloud computing and distributed systems.
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Machine learning based COVID-19 study performance prediction
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Review of recent advances in non-invasive hemoglobin estimation
Encapsulation_ Review paper, used for researhc scholars
Network Security Unit 5.pdf for BCA BBA.
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
MYSQL Presentation for SQL database connectivity
Reach Out and Touch Someone: Haptics and Empathic Computing
Per capita expenditure prediction using model stacking based on satellite ima...
sap open course for s4hana steps from ECC to s4
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Empathic Computing: Creating Shared Understanding
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Dropbox Q2 2025 Financial Results & Investor Presentation
Electronic commerce courselecture one. Pdf
Cloud computing and distributed systems.
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Mobile App Security Testing_ A Comprehensive Guide.pdf
Advanced methodologies resolving dimensionality complications for autism neur...
Machine learning based COVID-19 study performance prediction
Understanding_Digital_Forensics_Presentation.pptx
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Review of recent advances in non-invasive hemoglobin estimation

Async all around us (promises)

  • 1. ASYNC ALL AROUND US FRANCISCO MS FERREIRA @fmsf303
  • 4. Dart Futures Java Completable Futures JS Promises
  • 7. MY CODE DOESN’T WORK 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); };
  • 8. MY CODE DOESN’T WORK resultArr[i] = Availability(weekData[i]).save(function(err, result){ return result; });
  • 9. 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 }); });
  • 10. 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 }); }); }); });
  • 13. JAVA public CompletableFuture<String> ask() { final CompletableFuture<String> future = new CompletableFuture<>(); //... return future; }
  • 14. JAVA public CompletableFuture<String> ask() { final CompletableFuture<String> future = new CompletableFuture<>(); //... return future; } future.complete("42");
  • 15. JAVA public CompletableFuture<String> ask() { final CompletableFuture<String> future = new CompletableFuture<>(); //... return future; } future.complete("42"); future.get(); // this will block execution
  • 16. DART void printDailyNewsDigest() { File file = new File("dailyNewsDigest.txt"); Future future = file.readAsString(); future.then((content) { print(content); }); }
  • 17. DART Future<Item> getItem(){ var completer = new Completer(); // At some time you need to complete the future: completer.complete(new Item()); return completer.future; }
  • 18. PROMISES this.updateEmailsInDatabase = function() { var fetchEmailDeferer = Q.defer(); inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done(); return fetchEmailDeferer.promise; };
  • 19. PROMISES this.updateEmailsInDatabase = function() { var fetchEmailDeferer = Q.defer(); inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done(); return fetchEmailDeferer.promise; };
  • 20. PROMISES this.updateEmailsInDatabase = function() { var fetchEmailDeferer = Q.defer(); inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done(); return fetchEmailDeferer.promise; };
  • 21. PROMISES this.updateEmailsInDatabase = function() { var fetchEmailDeferer = Q.defer(); inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done(); return fetchEmailDeferer.promise; };
  • 22. PROMISES this.updateEmailsInDatabase = function() { var fetchEmailDeferer = Q.defer(); inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done(); return fetchEmailDeferer.promise; };
  • 23. PROMISES this.updateEmailsInDatabase = function() { var fetchEmailDeferer = Q.defer(); inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done(); return fetchEmailDeferer.promise; };
  • 24. PROMISES this.updateEmailsInDatabase = function() { var fetchEmailDeferer = Q.defer(); inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done(); return fetchEmailDeferer.promise; };
  • 25. PROMISES this.updateEmailsInDatabase = function() { var fetchEmailDeferer = Q.defer(); inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done(); return fetchEmailDeferer.promise; };
  • 26. WHAT IS A PROMISE? - Like a future - I promise that I will resolve a value
  • 27. WHAT IS A PROMISE? - Like a future - I promise that I will resolve a value - function fooBar() { - …; - return promise; - }
  • 28. 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();
  • 29. 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();
  • 30. 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 ); - });
  • 32. ARGUMENT FLOW inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done(); messages listMessages saveMessagesFromEmailServerLocally
  • 33. ARGUMENT FLOW inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done(); listMessages saveMessagesFromEmailServerLocally fetchEmailDeferer.resolve messages success
  • 35. BI-DIRECTIONAL ARGUMENTS databasePromise .then( openCollection( dbconfig.getUsersCollectionName() ) ) .then( insert(user) ) .then( addUserDeferer.resolve ) .done();
  • 36. BI-DIRECTIONAL ARGUMENTS databasePromise .then( openCollection( dbconfig.getUsersCollectionName() ) ) .then( insert(user) ) .then( addUserDeferer.resolve ) .done(); databasePromise openCollection getCollection database db collection
  • 37. BI-DIRECTIONAL ARGUMENTS //.then( openCollection( dbconfig.getUsersCollectionName() ) ) function openCollection( colectionToOpen ) { return function(db) { return db.collection( colectionToOpen ); }; } databasePromise openCollection getCollection database db collection
  • 38. BI-DIRECTIONAL ARGUMENTS //.then( openCollection( dbconfig.getUsersCollectionName() ) ) function openCollection( colectionToOpen ) { return function(db) { return db.collection( colectionToOpen ); }; } databasePromise openCollection getCollection database db collection
  • 39. BI-DIRECTIONAL ARGUMENTS //.then( openCollection( dbconfig.getUsersCollectionName() ) ) function openCollection( colectionToOpen ) { return function(db) { return db.collection( colectionToOpen ); }; } databasePromise openCollection getCollection database db collection
  • 43. 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 ); });
  • 44. READABLE & MAINTAINABLE inboxHandler .listMessages() .then( saveMessagesFromEmailServerLocally ) .then( fetchEmailDeferer.resolve ) .done();

Editor's Notes

  • #12: Huge ammount of questions on SO about how to write async code.
  • #13: You either try to access something that you can’t Or you are nesting deep, layer on top of layer
  • #32: Arguments are the door into the function They represent flow
  • #35: Arguments are the door into the function They represent flow