Asynchronous JavaScript and Promises

14
Async JavaScript and Promises Sunday, 25 August 13

description

Presentation on how JavaScript is Asynchronous and how to write async code using Promises

Transcript of Asynchronous JavaScript and Promises

Page 1: Asynchronous JavaScript and Promises

Async JavaScript and

Promises

Sunday, 25 August 13

Page 2: Asynchronous JavaScript and Promises

Callbacks

console.log("Before  readFile");fs.readFile("file1.txt",  function(file1Content)  {    console.log("File  Contents  here");    return  "#"  +  file1Content  +  "#";});console.log("After  readFile");

Functions are first class citizens in JavaScriptFunctions can takes functions as argument and call

them when they are done

Sunday, 25 August 13

Page 3: Asynchronous JavaScript and Promises

Callbacks

console.log("Before  readFile");fs.readFile("file1.txt",  function(file1Content)  {    console.log("File  Contents  here");    return  "#"  +  file1Content  +  "#";});console.log("After  readFile");

Functions are first class citizens in JavaScriptFunctions can takes functions as argument and call

them when they are done

Sunday, 25 August 13

Page 4: Asynchronous JavaScript and Promises

Is JavaScript really Async?

All of the JavaScript engines including V8 are single-threaded

But all I/O is evented and asynchronous

It is possible via the EventLoop

Sunday, 25 August 13

Page 5: Asynchronous JavaScript and Promises

An entity that handles and processes external events and converts them into callback invocations

Every asynchronous operation adds itself to the EventLoop

Event Loops

Sunday, 25 August 13

Page 6: Asynchronous JavaScript and Promises

How EventLoop works?

Sunday, 25 August 13

Page 7: Asynchronous JavaScript and Promises

Event Loop

Sunday, 25 August 13

Page 8: Asynchronous JavaScript and Promises

Making Code Asynchronous

setImmediate

process.nextTick

setTimeout / setInterval

Sunday, 25 August 13

Page 9: Asynchronous JavaScript and Promises

Promises

A Promise is an object that represents a one-time event, typically the outcome of an async task like an AJAX call.

At first, a Promise is in a pending state. Eventually, it’s either resolved or rejected.

Once a Promise is resolved or rejected, it’ll remain in that state forever, and its callbacks will never fire again.

Sunday, 25 August 13

Page 10: Asynchronous JavaScript and Promises

What are Promises For?

Sunday, 25 August 13

Page 11: Asynchronous JavaScript and Promises

Callback Hell

step1(function  (value1)  {    step2(value1,  function(value2)  {        step3(value2,  function(value3)  {            step4(value3,  function(value4)  {                //  Do  something  with  value4            });        });    });});

Q.fcall(promisedStep1).then(promisedStep2).then(promisedStep3).then(promisedStep4).then(function  (value4)  {        //  Do  something  with  value4}).done();

Promises can solve the problem of “Callback Hell”

Sunday, 25 August 13

Page 12: Asynchronous JavaScript and Promises

Handling exceptionsPromises also helps you handle exceptions in a cleaner way

var  handleError  =  console.log;

step1(function  (value1)  {    step2(value1,  function(value2)  {        step3(value2,  function(value3)  {            step4(value3,  function(value4)  {                //  Do  something  with  value4            },  handleError);        },  handleError);    },  handleError);},  handleError);

Q.fcall(promisedStep1).then(promisedStep2).then(promisedStep3).then(promisedStep4).then(function(value4)  {        //  Do  something  with  value4}).fail(function(error)  {        //  Handle  any  error  from  all  above  steps}).done();

Sunday, 25 August 13

Page 13: Asynchronous JavaScript and Promises

It makes the code Async

Q adds the functions in the chain to the Event loop

When the promised function returns, the promises are rejected/resolved during the next pass of the runloop

Sunday, 25 August 13

Page 14: Asynchronous JavaScript and Promises

Thank you

Code snippets used for the demo can be downloaded from https://gist.github.com/senthilkumarv/6326192

Contact at [email protected] and [email protected]

Sunday, 25 August 13