Download - Async all around us (promises)
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