promises & limbo

40
PROMISES & LIMBO

Upload: sylvain-faucherand

Post on 15-Jul-2015

129 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Promises & limbo

PROMISES & LIMBO

Page 2: Promises & limbo

GOALShowcase promises on LimboSimple methodology w/ Promises

Page 3: Promises & limbo

SUMMARYNodeJS & event-loopWhat's a promiseAdvanced usage

Page 4: Promises & limbo

NODEJS & EVENT-LOOPWhat's a promiseAdvanced usage

Page 5: Promises & limbo

SINGLE-THREADED ?

Page 6: Promises & limbo

main event-loopstack / queueautomatic (safe) threads, e.g.:

fs threadsnet threadsetc.

Page 7: Promises & limbo
Page 9: Promises & limbo

Everything runs in parallel except your code sic.

Page 10: Promises & limbo

FLOW CONTROL

Page 11: Promises & limbo

stuffA(params, function(err, result){ if (err){ return handleError(err); }

goAhead(results);

});

Callback (CPS)

Page 12: Promises & limbo

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

SUGAR PATTERNSEvent EmittersObserversGenerators

libraryPromises ...Async

Page 14: Promises & limbo

NodeJS & event-loop

WHAT'S A PROMISEAdvanced usage

Page 15: Promises & limbo

PROMISES IN JSNot in the languageSoon to be with ES6 (iojs,  node —-harmony)

Close-to-spec modulebluebird

Page 16: Promises & limbo

A promise represents the eventual result ofan asynchronous operation

Promises/A+ specification

Page 17: Promises & limbo

STATES

pending -

fulfilled any value

rejected reason Object

A promise is resolved once.

Page 18: Promises & limbo

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

COMBINATIONa promise is theanablea promise chain returns a promise

var promC = promA.then(promB);

// -> returns a Promise object

Page 20: Promises & limbo

HANDLING ERRORS/REJECTIONS

prom.then(onFulfilled, onRejected);

// Is equivalent to

prom.then(onFulfilled).catch(onRejected);

Page 21: Promises & limbo

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

NodeJS & event-loopWhat's a promise

ADVANCED USAGE

Page 23: Promises & limbo

COLLECTIONSPromise.all([promise1, promise2, ...]);

// -> returns a single promise

fulfilled when all promises arerejected when one of the promises is

Page 24: Promises & limbo

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

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

RESOLUTION PATTERNput on your glasses plz

Page 27: Promises & limbo
Page 28: Promises & limbo
Page 29: Promises & limbo
Page 30: Promises & limbo
Page 31: Promises & limbo

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
Page 33: Promises & limbo

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
Page 35: Promises & limbo

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

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

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

Q/A

Page 39: Promises & limbo

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

BYE.