{
    "componentChunkName": "component---src-templates-post-js",
    "path": "/understanding-promise-objects/",
    "result": {"data":{"markdownRemark":{"html":"<p><em>Note: This post assumes familiarity with JavaScript in general. You might want to refresh your memory on <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects\">objects</a> in particular.</em></p>\n<p>Table of contents:</p>\n<ul>\n<li><a href=\"#how-to-create-a-promise\">How to create a promise?</a></li>\n<li><a href=\"#what-is-actually-a-promise\">What is actually a promise?</a></li>\n<li><a href=\"#changing-the-state-and-result-of-promises\">Changing the state and result of promises</a></li>\n<li><a href=\"#how-to-use-promises\">How to use promises</a></li>\n<li><a href=\"#a-more-realistic-example\">A more realistic example</a></li>\n<li><a href=\"#a-few-words-about-asynchronicity\">A few words about asynchronicity</a></li>\n<li><a href=\"#how-to-use-promises-with-async-and-await\">How to use promises with async and await?</a></li>\n<li><a href=\"#further-reading\">Further reading</a></li>\n<li><a href=\"#feedback\">Feedback</a></li>\n</ul>\n<p><a id=\"how-to-create-a-promise\"></a></p>\n<h2>How to create a promise?</h2>\n<p>We can create a promise with the Promise constructor:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// example 1</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">foo</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span> <span class=\"token comment\">// We can rename \"foo\"  however we like.</span>\n\n<span class=\"token keyword\">const</span> myPromise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span>foo<span class=\"token punctuation\">)</span> <span class=\"token comment\">// Creates a promise.</span></code></pre></div>\n<p>The constructor expects one argument in the form of a function to initialize a promise. The specification gave this function the name \"executor\".</p>\n<p>In <em>example 1</em>, we have passed an executor that does nothing (the function's body is empty), still, the constructor successfully creates a promise.</p>\n<p>If nothing, or anything other than a function is passed, we get a type error:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// example 2</span>\n\n<span class=\"token keyword\">const</span> myPromise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// Type error since nothing is passed.</span></code></pre></div>\n<p>However, to create a useful promise, we probably want to pass an executor to the constructor that does something useful. We will do just that at the end of this post, but first, let's develop a better sense for what a promise actually is.</p>\n<p><a id=\"what-is-actually-a-promise\"></a></p>\n<h2>What is actually a promise?</h2>\n<p>According to the ECMAScript Language Specification:</p>\n<blockquote>\n<p>A Promise is an object that is used as a placeholder for the eventual results of a deferred (and possibly asynchronous) computation.</p>\n</blockquote>\n<p>Do not let the language specification's use of \"Promise\", with a capital letter \"P\", confuse you. It does not refer to the Promise constructor (constructors are usually capitalized), it refers to an instance (which we normally do not capitalize). Think of \"Promise\" in the quote from the specification as \"myPromise\" in <em>example 1</em>.</p>\n<p>So a promise is an object.</p>\n<p>More specifically, it is an instance of the Promise constructor or Promise type, if you will.</p>\n<p>It has properties and methods like any other object.</p>\n<p>If we <code class=\"language-text\">console.log</code> a promise, we can take a look at the anatomy of the object:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// example 3</span>\n\n<span class=\"token keyword\">const</span> myPromise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>myPromise<span class=\"token punctuation\">)</span></code></pre></div>\n<p>We see 3 properties live directly on each instance of a Promise. In chrome, they are called <code class=\"language-text\">Prototype</code> (we will get to this later),  <code class=\"language-text\">PromiseState</code> and <code class=\"language-text\">PromiseResult</code>.</p>\n<p>We can think of the <code class=\"language-text\">PromiseState</code> and <code class=\"language-text\">PromiseResult</code> properties as the actual \"placeholders\"  the specification is referring to in a more abstract manner. Both properties are internal, i.e. inaccessible or not meant to be accessed by us directly.</p>\n<p>Their initial values are \"pending\" and \"undefined\", respectively.</p>\n<p>Now take a look at this example:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// example 4</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">executor</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">/**\n   * We may do some \"computation\".\n   *\n   * ...\n   *\n   * Once we are finished,\n   * we may mutate the properties of the promise object\n   * to reflect the result of the computation.\n   **/</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> myPromise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span>executor<span class=\"token punctuation\">)</span></code></pre></div>\n<p>The \"computation\" the language specification refers to is the code we write in our executor (see <em>example 4</em>).</p>\n<p>And basically, the purpose of each promise object is to:</p>\n<ol>\n<li>Allow us to reflect the result of our computation in its properties (<code class=\"language-text\">PromiseState</code> and <code class=\"language-text\">PromiseResult</code>).</li>\n<li>Provide methods to schedule function calls (\"callbacks\") for the time after a change in its state.</li>\n</ol>\n<p>We will discuss the second point and how to use the methods (<code class=\"language-text\">Promise.prototype.then</code>, <code class=\"language-text\">Promise.prototype.catch</code>, <code class=\"language-text\">Promise.prototype.finally</code>) very soon, but only after looking at some examples of how the properties (state and result) of a promise can be mutated.</p>\n<p><a id=\"changing-the-state-and-result-of-promises\"></a></p>\n<h2>Changing the state and result of promises</h2>\n<p>The executor is actually a <em>higher order function</em>. It takes two functions as arguments. To mutate the properties of a promise, we just have to call either the first or the second.</p>\n<p>Let's see the examples!</p>\n<p>Without having called anything, state and result are populated with their initial values:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// example 5</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">executor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fufill<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">/**\n   * We are still computing...\n   *\n   * Our program has yet to reach our call to fulfill or reject.\n   **/</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> myPromise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span>executor<span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>myPromise<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\">// state: \"pending\", result: undefined</span>\n\n<span class=\"token comment\">// These are the initial values.</span></code></pre></div>\n<p>Call the first function (without an argument):</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// example 6</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">executor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fulfill</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Finished computing.</span>\n\n  <span class=\"token function\">fulfill</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// Our program finally reached this call</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> myPromise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span>executor<span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>myPromise<span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// state: \"fulfilled\", result: undefined</span></code></pre></div>\n<p>Call it with a number:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// example 7</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">executor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fulfill</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Finished computing.</span>\n\n  <span class=\"token function\">fulfill</span><span class=\"token punctuation\">(</span><span class=\"token number\">9</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// Our program finally reached this call</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> myPromise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span>executor<span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>myPromise<span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// state: \"fulfilled\", result: 9</span></code></pre></div>\n<p>The result could be an object:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// example 8</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">executor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fulfill</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Finished computing.</span>\n\n  <span class=\"token comment\">// We could pass an object:</span>\n  <span class=\"token function\">fulfill</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>word<span class=\"token operator\">:</span> <span class=\"token string\">'discombobulate'</span><span class=\"token punctuation\">,</span> frequency<span class=\"token operator\">:</span> <span class=\"token string\">'rare'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> myPromise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span>executor<span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>myPromise<span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// state: \"fulfilled\", result: {word: 'discombobulate', frequency: 'rare'}</span></code></pre></div>\n<p>Call our reject function without an argument:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// example 9</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">executor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fulfill<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Finished computing, but something went wrong.</span>\n\n  <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> myPromise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span>executor<span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>myPromise<span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// state: \"rejected\", result: undefined</span></code></pre></div>\n<p>Call our reject function with a number:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// example 10</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">executor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fulfill<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Finished computing, but something went wrong.</span>\n\n  <span class=\"token comment\">// We could pass a number (if we wanted):</span>\n  <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token number\">11</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> myPromise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span>executor<span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>myPromise<span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// state: \"rejected\", result: 11</span></code></pre></div>\n<p>Usually we call our reject function with an Error object:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// example 11</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">executor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fulfill<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Finished computing, but something went wrong.</span>\n\n  <span class=\"token comment\">// Usually an Error object is passed:</span>\n  <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">'My error message.'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> myPromise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span>executor<span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>myPromise<span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// state: \"rejected\", result: error object</span></code></pre></div>\n<p><em>Note: we may replace \"fulfill\" and \"reject\" with any name we want.</em></p>\n<p><a id=\"how-to-use-promises\"></a></p>\n<h2>How to use promises</h2>\n<p>If you recall from earlier, all instances of Promise also have a <code class=\"language-text\">Prototype</code> property. This is where the methods shared by all instances live. We are interested in <code class=\"language-text\">Promise.prototype.then</code>, <code class=\"language-text\">Promise.prototype.catch</code> and <code class=\"language-text\">Promise.prototype.finally</code>.</p>\n<p>Take a look at this example:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// example 12</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">executor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fulfill<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> computation <span class=\"token operator\">=</span> <span class=\"token string\">'apple'</span> <span class=\"token operator\">===</span> <span class=\"token string\">'apple'</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>computation<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">fulfill</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Successful'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Failed'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> myPromise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span>executor<span class=\"token punctuation\">)</span>\n\n<span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Our promise after 1s: '</span><span class=\"token punctuation\">,</span> myPromise<span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// state: \"pending\", result: undefined</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Our promise after 5s: '</span><span class=\"token punctuation\">,</span> myPromise<span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// state: \"fulfilled\", result: \"Successful\"</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5000</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Here we use <code class=\"language-text\">setTimeout</code> to pretend doing some computation for 3 seconds, and then, the function passed to <code class=\"language-text\">setTimeout</code> is run. For this example, the result is always true, which always satisfies our condition, therefore we always call <em>fulfill</em> with the string \"Successful\".</p>\n<p>What is interesting about the above, is how we log <code class=\"language-text\">myPromise</code> twice (after 1 second and after 5 seconds).</p>\n<p>Look at the state and the result: they change (as we might expect, since after 3 seconds, we call <em>fulfill</em> with a string, to change the state and the result).</p>\n<p>However, it would be tedious and inefficient to make guesses how long the computation will take. Wouldn't it be convenient, if we could just tell what to do if it's finished? Also, how do we use something like the result of the computation?</p>\n<p>Luckily, promise objects have methods to come to our rescue!</p>\n<p>Let's see how they work.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// example 13</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">executor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fulfill<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> computation <span class=\"token operator\">=</span> <span class=\"token string\">'apple'</span> <span class=\"token operator\">===</span> <span class=\"token string\">'apple'</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>computation<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// Satisfies the condition</span>\n      <span class=\"token function\">fulfill</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Successful'</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// Do this.</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Failed'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> myPromise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span>executor<span class=\"token punctuation\">)</span>\n\nmyPromise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>\n  <span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span></code></pre></div>\n<p>And with a slight modification, to always call the second argument of the executor:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// example 14</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">executor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fulfill<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> computation <span class=\"token operator\">=</span> <span class=\"token string\">'apple'</span> <span class=\"token operator\">===</span> <span class=\"token string\">'orange'</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>computation<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// Fails to satisfy the condition.</span>\n      <span class=\"token function\">fulfill</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Successful'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Failed'</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// Do this.</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> myPromise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span>executor<span class=\"token punctuation\">)</span>\n\nmyPromise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>\n  <span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span></code></pre></div>\n<p>With the <code class=\"language-text\">Promise.prototype.then</code> method, we can schedule function calls (\"callbacks\") for the time after the promise's state changes.\nNot only that, it allows us to use the value of the object's result property via the optional parameter of the callback.</p>\n<p>In more detail:</p>\n<p><code class=\"language-text\">Promise.prototype.then</code> can take two callback functions.</p>\n<p>Depending on which state the promise ends up in, either the first or the second callback is run.</p>\n<ul>\n<li>\n<p>The first callback is run if the promise's state changes to \"fulfilled\". It can take one argument. This argument takes the value we have passed to the first function of our executor. In <em>example 13</em>, it is the string saying \"Successful\".</p>\n</li>\n<li>\n<p>The second callback is run if the promise's state changes to \"rejected\". It can also take one argument, but this argument takes the value we have passed to the second function of our executor. In <em>example 14</em>, it is the string saying \"Failed\".</p>\n</li>\n</ul>\n<p>Now take a look at this example:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// example 15</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">executor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fulfill<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> computation <span class=\"token operator\">=</span> <span class=\"token string\">'apple'</span> <span class=\"token operator\">===</span> <span class=\"token string\">'orange'</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>computation<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// Fails to satisfy the condition.</span>\n      <span class=\"token function\">fulfill</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Successful'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Failed'</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// Do this.</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> myPromise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span>executor<span class=\"token punctuation\">)</span>\n\nmyPromise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>\n  <span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>This does something similar to the previous example.</p>\n<p><em>Promise.prototype.catch</em> gives us an opportunity to handle or \"catch\" any problematic promises (i.e. promises with a \"rejected\" state).</p>\n<p>In case you are wondering, here is some further reading about how <code class=\"language-text\">catch</code> compares to handling errors with <code class=\"language-text\">then</code>:</p>\n<p><a href=\"https://stackoverflow.com/questions/40067852/in-a-promise-whats-the-difference-between-using-catch-and-the-2nd-argument-of\">In a Promise, what's the difference between using catch and the 2nd argument of then?</a></p>\n<p>It is important to note here, that all 3 methods (<code class=\"language-text\">then</code>, <code class=\"language-text\">catch</code>, <code class=\"language-text\">finally</code>) return a promise, which makes it possible to chain them. This concept is called \"method chaining\".</p>\n<p>Now take a look at this example:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// example 16</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">executor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fulfill<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> computation <span class=\"token operator\">=</span> <span class=\"token string\">'apple'</span> <span class=\"token operator\">===</span> <span class=\"token string\">'orange'</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>computation<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// Fails to satisfy the condition.</span>\n      <span class=\"token function\">fulfill</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Successful'</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Failed'</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// Do this.</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3000</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> myPromise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span>executor<span class=\"token punctuation\">)</span>\n\nmyPromise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>\n  <span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span>\n  <span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">finally</span><span class=\"token punctuation\">(</span>\n  <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Clean things up.'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span></code></pre></div>\n<p><code class=\"language-text\">Promise.prototype.finally</code> allows us to schedule a callback that always runs if the promise is settled, meaning, if its state becomes \"fulfilled\" or \"rejected\".</p>\n<p><a id=\"a-more-realistic-example\"></a></p>\n<h2>A more realistic example</h2>\n<p>As MDN points out:</p>\n<blockquote>\n<p>The Promise constructor is primarily used to wrap functions that do not already support promises.</p>\n</blockquote>\n<p><a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/Promise\">MDN documentation of the Promise() constructor</a></p>\n<p>The article also gives this example:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// example 17</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">myAsyncFunction</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">url</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> xhr <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">XMLHttpRequest</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    xhr<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">'GET'</span><span class=\"token punctuation\">,</span> url<span class=\"token punctuation\">)</span>\n    xhr<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onload</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span>xhr<span class=\"token punctuation\">.</span>responseText<span class=\"token punctuation\">)</span>\n    xhr<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onerror</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span>xhr<span class=\"token punctuation\">.</span>statusText<span class=\"token punctuation\">)</span>\n    xhr<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>And this is how we might use this function (with <code class=\"language-text\">Promise.prototype.then</code>):</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// example 18</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">myAsyncFunction</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">url</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve<span class=\"token punctuation\">,</span> reject</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> xhr <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">XMLHttpRequest</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    xhr<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">'GET'</span><span class=\"token punctuation\">,</span> url<span class=\"token punctuation\">)</span>\n    xhr<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onload</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span>xhr<span class=\"token punctuation\">.</span>responseText<span class=\"token punctuation\">)</span>\n    xhr<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onerror</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">reject</span><span class=\"token punctuation\">(</span>xhr<span class=\"token punctuation\">.</span>statusText<span class=\"token punctuation\">)</span>\n    xhr<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> myPromise <span class=\"token operator\">=</span> <span class=\"token function\">myAsyncFunction</span><span class=\"token punctuation\">(</span><span class=\"token string\">'https://catfact.ninja/fact'</span><span class=\"token punctuation\">)</span>\n\nmyPromise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>\n  <span class=\"token punctuation\">(</span><span class=\"token parameter\">result</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">)</span></code></pre></div>\n<p>Based on what we have learned so far, what does this code do? We don't have to understand each bit, but in essence:</p>\n<ol>\n<li>myAsyncFunction is a function that uses a <strong>Promise constructor</strong> to create an instance of a promise.\n<ol>\n<li>The constructor takes an <strong>executor function</strong> (with parameters called \"resolve\" and \"reject\" in this case).</li>\n<li>In the executor's body, we do our <strong>\"computation\"</strong>:\n<ol>\n<li>We create an XHR object and prepare a GET request.</li>\n<li>We <strong>get ready to call resolve</strong> with the response text, in case the request is successful.</li>\n<li>We <strong>get ready to call reject</strong> with the status text, in case the request encounters an error.</li>\n<li>We dispatch the request to the server.</li>\n</ol>\n</li>\n</ol>\n</li>\n<li>We call myAsyncFunction to <strong>create a promise</strong> (\"myPromise\").</li>\n<li>We call the promise's <code class=\"language-text\">then</code> method, to <strong>schedule our callbacks</strong>.</li>\n</ol>\n<p><a id=\"a-few-words-about-asynchronicity\"></a></p>\n<h2>A few words about promise asynchronicity</h2>\n<p><em>Much of this section is based on a <a href=\"https://www.youtube.com/watch?v=8aGhZQkoFbQ\">presentation by Philip Roberts</a>.</em></p>\n<p>One thing that might be confusing is what <code class=\"language-text\">setTimeout</code> has to do with asynchronicity.</p>\n<p><code class=\"language-text\">setTimeout</code> sets a timer and schedules a function call (callback) for the time after the timer has expired. However we do not have to wait for the timer to expire, we can continue running other code.</p>\n<p>How can the JS runtime keep track of a countdown and also continue running other code?</p>\n<p>It can't, it only has a single thread, it can do one thing at a time.</p>\n<p>However, browsers can also access Web APIs, which you can think of as other threads, which is how concurrent computations are possible.</p>\n<p>To my best understanding, asynchronicity in JavaScript means some computation (like the countdown) is handed over to a Web API and is then able to run concurrently, and that we can schedule callbacks for the time after the computation has finished.</p>\n<h3>How callbacks are handled</h3>\n<p>Even if a promise is fulfilled immediately, its callbacks have to be scheduled first:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// example 19</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">executor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fulfill</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">fulfill</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Success'</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> myPromise <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span>executor<span class=\"token punctuation\">)</span>\n\nmyPromise<span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">data</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// The callback is scheduled but not executed</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'I will run before the callback.'</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// We Continue running other code</span>\n\n<span class=\"token comment\">// I will run before the callback. </span>\n<span class=\"token comment\">// Success </span></code></pre></div>\n<p>Almost as though we were using <code class=\"language-text\">setTimout</code> with a 0 delay, to defer running our code. In reality, promise callbacks are added to the \"microtask queue\", whereas <code class=\"language-text\">setTimout</code> callbacks are added to the \"task queue\".</p>\n<p>In case you want to get a picture of how tasks and microtasks are handled, I have found this <a href=\"https://www.youtube.com/watch?v=cCOL7MC4Pl0\">presentation by Jake Archibald</a> very interesting.</p>\n<h3>Blocking executors</h3>\n<p>The code of an executor could produce blocking behavior, since it is run synchronously. For this reason, if you were wondering, if we could wrap a synchronous computation in a promise, to make it asynchronous, <em>we can not</em>.</p>\n<p>Further discussion:\n<a href=\"https://stackoverflow.com/questions/53876344/correct-way-to-write-a-non-blocking-function-in-node-js\">Correct way to write a non-blocking function in Node.js</a></p>\n<p><a id=\"how-to-use-promises-with-async-and-await\"></a></p>\n<h2>How to use promises with async and await?</h2>\n<p>Promise methods are not the only way we can use promises.</p>\n<p>We could similarly schedule operations for the time after a promise's state changes with <code class=\"language-text\">async</code> and <code class=\"language-text\">await</code>.</p>\n<p>Let's see an example!</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// example 20</span>\n\n<span class=\"token keyword\">const</span> url <span class=\"token operator\">=</span> <span class=\"token string\">'https://catfact.ninja/fact'</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">fetchCatFactOne</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">url</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">response</span> <span class=\"token operator\">=></span> response<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">obj</span> <span class=\"token operator\">=></span> obj<span class=\"token punctuation\">.</span>fact<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token function\">fetchCatFactTwo</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">url</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">const</span> obj <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> response<span class=\"token punctuation\">.</span><span class=\"token function\">json</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">return</span> obj<span class=\"token punctuation\">.</span>fact\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">fetchCatFactOne</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">a</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token function\">fetchCatFactTwo</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">a</span> <span class=\"token operator\">=></span> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Both functions do the same thing, only the syntax is different.</p>\n<p>They fetch data from an API and return a promise that is fulfilled with a text about cats.</p>\n<p>We can observe how in the first function, the first argument to <code class=\"language-text\">then</code> will be the promise's fulfillment value.</p>\n<p>Whereas in our async function, we have access to the same fulfillment value by preceding a function - that returns a promise - with the await keyword.</p>\n<p><a id=\"further-reading\"></a></p>\n<h2>Further reading</h2>\n<p>We've arrived at the end of this post, I will finish with some additional reading material:</p>\n<ul>\n<li>\n<p><a href=\"https://github.com/domenic/promises-unwrapping/blob/master/docs/states-and-fates.md\">States and Fates by Domenic Denicola</a></p>\n</li>\n<li>\n<p><a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\">The MDN documentation of promise objects</a></p>\n</li>\n<li>\n<p><a href=\"https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\">How to use an XHR object without \"promisification\"</a></p>\n</li>\n<li>\n<p>We don't actually need to \"promisify\" requests since there is a new API for fetching resources with promise capabilities out of the box: <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API\">Fetch API</a></p>\n</li>\n<li>\n<p><a href=\"https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Async_await\">More about how to use async and await</a></p>\n</li>\n</ul>\n<p><a id=\"feedback\"></a></p>\n<h2>Feedback</h2>\n<p>There is more to promises, but I didn't want to make this post  longer.</p>\n<p>In my opinion, the terminology around promises can be a bit confusing - I hope I did not add more to it.</p>\n<p>I don't have a comments section, but to ask questions, suggest changes and what have you, you can open an <a href=\"https://github.com/andrasna/gatsby-theme-andras/issues\">issue on github</a>, or you can send me an email.</p>","id":"f2d8b18b-65e5-5b02-87c1-83d49a58be55","frontmatter":{"title":"Understanding promise objects","date":"December 12, 2021"}}},"pageContext":{"id":"f2d8b18b-65e5-5b02-87c1-83d49a58be55","previousPostId":null,"nextPostId":null}},
    "staticQueryHashes": []}