promises & limbo
TRANSCRIPT
![Page 1: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/1.jpg)
PROMISES & LIMBO
![Page 2: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/2.jpg)
GOALShowcase promises on LimboSimple methodology w/ Promises
![Page 3: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/3.jpg)
SUMMARYNodeJS & event-loopWhat's a promiseAdvanced usage
![Page 4: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/4.jpg)
NODEJS & EVENT-LOOPWhat's a promiseAdvanced usage
![Page 5: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/5.jpg)
SINGLE-THREADED ?
![Page 6: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/6.jpg)
main event-loopstack / queueautomatic (safe) threads, e.g.:
fs threadsnet threadsetc.
![Page 7: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/7.jpg)
![Page 9: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/9.jpg)
Everything runs in parallel except your code sic.
![Page 10: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/10.jpg)
FLOW CONTROL
![Page 11: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/11.jpg)
stuffA(params, function(err, result){ if (err){ return handleError(err); }
goAhead(results);
});
Callback (CPS)
![Page 12: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/12.jpg)
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
![Page 13: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/13.jpg)
SUGAR PATTERNSEvent EmittersObserversGenerators
libraryPromises ...Async
![Page 14: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/14.jpg)
NodeJS & event-loop
WHAT'S A PROMISEAdvanced usage
![Page 15: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/15.jpg)
PROMISES IN JSNot in the languageSoon to be with ES6 (iojs, node —-harmony)
Close-to-spec modulebluebird
![Page 16: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/16.jpg)
A promise represents the eventual result ofan asynchronous operation
Promises/A+ specification
![Page 17: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/17.jpg)
STATES
pending -
fulfilled any value
rejected reason Object
A promise is resolved once.
![Page 18: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/18.jpg)
WRITE A PROMISEvar promA = new Promise(function(resolve, reject){
// ... any async computation ...
reject(new Error('Arf')); // rejected ;_;
// ...
resolve(result); // fulfilled ̂ _̂
});
// -> Promise object
![Page 19: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/19.jpg)
COMBINATIONa promise is theanablea promise chain returns a promise
var promC = promA.then(promB);
// -> returns a Promise object
![Page 20: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/20.jpg)
HANDLING ERRORS/REJECTIONS
prom.then(onFulfilled, onRejected);
// Is equivalent to
prom.then(onFulfilled).catch(onRejected);
![Page 21: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/21.jpg)
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
![Page 22: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/22.jpg)
NodeJS & event-loopWhat's a promise
ADVANCED USAGE
![Page 23: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/23.jpg)
COLLECTIONSPromise.all([promise1, promise2, ...]);
// -> returns a single promise
fulfilled when all promises arerejected when one of the promises is
![Page 24: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/24.jpg)
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
![Page 25: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/25.jpg)
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
![Page 26: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/26.jpg)
RESOLUTION PATTERNput on your glasses plz
![Page 27: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/27.jpg)
![Page 28: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/28.jpg)
![Page 29: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/29.jpg)
![Page 30: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/30.jpg)
![Page 31: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/31.jpg)
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);
![Page 32: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/32.jpg)
![Page 33: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/33.jpg)
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);
![Page 34: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/34.jpg)
![Page 35: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/35.jpg)
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);
![Page 36: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/36.jpg)
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);
![Page 37: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/37.jpg)
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);
![Page 38: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/38.jpg)
Q/A
![Page 39: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/39.jpg)
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
![Page 40: Promises & limbo](https://reader030.vdocuments.site/reader030/viewer/2022032616/55a68d7c1a28abbe7d8b474c/html5/thumbnails/40.jpg)
BYE.