JavaScript Promises

"I Promise a Result!

JavaScript Promise Object

A JavaScript Promise object contains both the producing code and calls to the consuming code:

Promise Syntax

let myPromise = new Promise(function(myResolve, myReject) {
// "Producing Code" (May take some time)

  myResolve(); // when successful
  myReject();  // when error
});

// "Consuming Code" (Must wait for a fulfilled Promise)
myPromise.then(
  function(value) { /* code if successful */ },
  function(error) { /* code if some error */ }
);

When the producing code obtains the result, it should call one of the two callbacks:

ResultCall
SuccessmyResolve(result value)
ErrormyReject(error object)

Promise Object Properties

A JavaScript Promise object can be:

  • Pending
  • Fulfilled
  • Rejected
  • The Promise object supports two properties: state and result.

    While a Promise object is "pending" (working), the result is undefined.

    When a Promise object is "fulfilled", the result is a value.

    When a Promise object is "rejected", the result is an error object.

    myPromise.statemyPromise.result
    "pending"undefined
    "fulfilled"a result value
    "rejected"an error object

    You cannot access the Promise properties state and result.

    You must use a Promise method to handle promises.

    Promise How To

    Here is how to use a Promise:

    myPromise.then(
      function(value) { /* code if successful */ },
      function(error) { /* code if some error */ }
    );

    Promise.then() takes two arguments, a callback for success and another for failure.

    Both are optional, so you can add a callback for success or failure only.

    Example

    function myDisplayer(some) {
      document.getElementById("demo").innerHTML = some;
    }

    let myPromise = new Promise(function(myResolve, myReject) {
      let x = 0;

    // The producing code (this may take some time)

      if (x == 0) {
        myResolve("OK");
      } else {
        myReject("Error");
      }
    });

    myPromise.then(
      function(value) {myDisplayer(value);},
      function(error) {myDisplayer(error);}
    );

    Try it Yourself »

    JavaScript Promise Examples

    To demonstrate the use of promises, we will use the callback examples from the previous chapter:

  • Waiting for a Timeout
  • Waiting for a File
  • Waiting for a Timeout

    Example Using Callback

    setTimeout(function() { myFunction("I love You !!!"); }, 3000);

    function myFunction(value) {
      document.getElementById("demo").innerHTML = value;
    }

    Try it Yourself »

    Example Using Promise

    let myPromise = new Promise(function(myResolve, myReject) {
      setTimeout(function() { myResolve("I love You !!"); }, 3000);
    });

    myPromise.then(function(value) {
      document.getElementById("demo").innerHTML = value;
    });

    Try it Yourself »

    Waiting for a file

    Example using Callback

    function getFile(myCallback) {
      let req = new XMLHttpRequest();
      req.open('GET', "mycar.html");
      req.onload = function() {
        if (req.status == 200) {
          myCallback(req.responseText);
        } else {
          myCallback("Error: " + req.status);
        }
      }
      req.send();
    }

    getFile(myDisplayer);

    Try it Yourself »

    Example using Promise

    let myPromise = new Promise(function(myResolve, myReject) {
      let req = new XMLHttpRequest();
      req.open('GET', "mycar.htm");
      req.onload = function() {
        if (req.status == 200) {
          myResolve(req.response);
        } else {
          myReject("File not Found");
        }
      };
      req.send();
    });

    myPromise.then(
      function(value) {myDisplayer(value);},
      function(error) {myDisplayer(error);}
    );

    Try it Yourself »

    table.browserref { border-collapse:collapse;width:100%; } table.browserref th:first-child,table.browserref td:first-child{padding-left:16px} table.browserref th{ height:32px;background-repeat:no-repeat;background-position:center center;font-weight:normal;padding:11px 5px 11px 5px;vertical-align:middle; } table.browserref .bsChrome {background-image:url('/images/compatible_chrome.png');} table.browserref .bsEdge {background-image:url('/images/compatible_edge.png');} table.browserref .bsFirefox {background-image:url('/images/compatible_firefox.png')} table.browserref .bsSafari {background-image:url('/images/compatible_safari.png');} table.browserref .bsOpera {background-image:url('/images/compatible_opera.png')} table.browserref td{ text-align:center;padding:8px;vertical-align:top; }

    Browser Support

    ECMAScript 2015, also known as ES6, introduced the JavaScript Promise object.

    The following table defines the first browser version with full support for Promise objects:

    Chrome 33 Edge 12 Firefox 29 Safari 7.1 Opera 20
    Feb, 2014 Jul, 2015 Apr, 2014 Sep, 2014 Mar, 2014