Post on 15-Jul-2015
PROMISES & LIMBO
GOALShowcase promises on LimboSimple methodology w/ Promises
SUMMARYNodeJS & event-loopWhat's a promiseAdvanced usage
NODEJS & EVENT-LOOPWhat's a promiseAdvanced usage
SINGLE-THREADED ?
main event-loopstack / queueautomatic (safe) threads, e.g.:
fs threadsnet threadsetc.
Everything runs in parallel except your code sic.
FLOW CONTROL
stuffA(params, function(err, result){ if (err){ return handleError(err); }
goAhead(results);
});
Callback (CPS)
stuff(params, function(err, result){ if (err){ return handleError(err); } otherStuff(params, function(err, result){ if (err){ return handleError(err); } yetAnotherStuff(params, function(err, result){ if (err){ return handleError(err); } goAhead(results); }); });});
The famous callback Hell
SUGAR PATTERNSEvent EmittersObserversGenerators
libraryPromises ...Async
NodeJS & event-loop
WHAT'S A PROMISEAdvanced usage
PROMISES IN JSNot in the languageSoon to be with ES6 (iojs, node —-harmony)
Close-to-spec modulebluebird
A promise represents the eventual result ofan asynchronous operation
Promises/A+ specification
STATES
pending -
fulfilled any value
rejected reason Object
A promise is resolved once.
WRITE A PROMISEvar promA = new Promise(function(resolve, reject){
// ... any async computation ...
reject(new Error('Arf')); // rejected ;_;
// ...
resolve(result); // fulfilled ̂ _̂
});
// -> Promise object
COMBINATIONa promise is theanablea promise chain returns a promise
var promC = promA.then(promB);
// -> returns a Promise object
HANDLING ERRORS/REJECTIONS
prom.then(onFulfilled, onRejected);
// Is equivalent to
prom.then(onFulfilled).catch(onRejected);
HANDLING ERRORS/REJECTIONS
var promC = promA.then(promB).catch(function handleError(err){ log(err);});
even if promA or is rejected, promC will be fulfilled
var promC = promA.then(promB).catch(function handleError(err){ log(err); throw err; // broadcast error});
if promA is rejected, promC will be rejected
NodeJS & event-loopWhat's a promise
ADVANCED USAGE
COLLECTIONSPromise.all([promise1, promise2, ...]);
// -> returns a single promise
fulfilled when all promises arerejected when one of the promises is
PROMISIFICATIONfrom CPS to promise style
var request = require('request');
Promise.promisifyAll(request);// creates promises from cps async functions
request.get('url', options, function(err, result){ ...});
request.getAsync(url, options).then(...);// -Async suffixed functions return promises
NODEIFICATIONfrom promise style to CPS
function getInfo(token, callback){ ... return infoFrom(token).nodeify(callback);}
getInfo('h3dsxz4i');// -> returns a promise
getInfo('h3dsxz4i', function(err, result){...});// -> returns a promise too actually
Both signatures accepted
RESOLUTION PATTERNput on your glasses plz
var
prom_A = stuff_A(params),
prom_C = stuff_C(params),
prom_B = Promise.join(prom_A, prom_C).spread(handleResults_B),
prom_D = Promise.join(prom_A, prom_B).spread(handleResults_D)
;
prom_D.then(handleResults);
var
prom_A = stuff_A(params),
prom_C = stuff_C(params).catch(function(err){ log(err); return {}; }),
prom_B = Promise.join(prom_A, prom_C).spread(handleResults_B),
prom_D = Promise.join(prom_A, prom_B).spread(handleResults_D)
;
prom_D.then(handleResults);
var prom_A = stuff_A(params).catch(function(err){ log(err); return 'Default stuff'; }), prom_C = stuff_C(params).catch(function(err){ log(err); return {}; }), prom_B = Promise.join(prom_A, prom_C).spread(handleResults_B), prom_D = Promise.join(prom_A, prom_B).spread(handleResults_D);
prom_D.then(handleResults);
var
prom_A = stuff_A(params).catch(function(err){ log(err); return 'Default stuff'; }), prom_C = stuff_C(params).catch(function(err){ log(err); return {}; }), prom_B = Promise.join(prom_A, prom_C).spread(handleResults_B), prom_D = Promise.join(prom_A, prom_B).spread(handleResults_D)
;
prom_D.then(handleResults).catch(handleError);
Example in webapp( )RecruiterStatisticsService#getAllJobOffersStats
return Promise.all([
jobOffersStatsPromise,
jobOffersStatsPromise .then(getJobOffersIds) .then(function (jobOffersIds) { if (jobOffersIds.length) { return getJobOfferProlongations(jobOffersIds); } })
])
.spread(mergeJobOffersStats).nodeify(callback);
Q/A
THX.src/ src/ src/ src/ src/
Understanding the nodeJS event loopWhat the heck is the event loop anyway?docs.libuv.org/en/latestpromisesaplus.comgithub.com/petkaantonov/bluebird
BYE.