<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Bind on SNow adventures</title>
    <link>https://www.snow-adventures.com/tags/bind/</link>
    <description>Recent content in Bind on SNow adventures</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <copyright>© Samuel Meylan - 2020</copyright>
    <lastBuildDate>Tue, 09 Jun 2020 00:00:00 +0000</lastBuildDate><atom:link href="https://www.snow-adventures.com/tags/bind/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>High order function in script include, accessing the context (this)</title>
      <link>https://www.snow-adventures.com/posts/high-order-function-in-script-include-accessing-the-context-this/</link>
      <pubDate>Tue, 09 Jun 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.snow-adventures.com/posts/high-order-function-in-script-include-accessing-the-context-this/</guid>
      <description>how to access this context when using high order functions in a ServiceNow script include.</description>
      <content:encoded><![CDATA[<p>In the Service-Now script includes (or in Javascript in general), the context of the <code>this</code> in not reachable when using high order function.</p>
<p>This might be obvious for some of you, but it was not for me and I struggled some time to achieve what I wanted in a <em>clean</em> manner. Hence this post.</p>
<p>You are maybe wondering what are high order functions? Well this can be defined as follow :</p>
<blockquote>
<p>Functions that operate on other functions, either by taking them as arguments or by returning them, are called <em>higher-order functions</em>.</p>
<p>-- Marijn Haverbeke, <em>Eloquent JavaScript, 3rd edition</em></p>
</blockquote>
<p>Practically this is what is used when using for example call-back functions or whenever you are passing a function as an argument to another function.</p>
<p>When doing so, <code>this</code> refers to the context. In Service-Now script include, it is typically used to reference global variables, that are accessible by all the functions within the script include, and to call other functions inside of the script include.</p>
<h2 id="common-usage-of-this">common usage of <code>this</code></h2>
<p>For example, in the following code we are use <code>this</code> to access the variable <code>setInit</code> and to call the function <code>myOtherFunction</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">test</span> <span class="o">=</span> <span class="nx">Class</span><span class="p">.</span><span class="nx">create</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="nx">test</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">this</span><span class="p">.</span><span class="nx">setInit</span><span class="o">=</span> <span class="s2">&#34;Set in init&#34;</span><span class="p">;</span> 
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="nx">myFunction</span> <span class="o">:</span> <span class="kd">function</span> <span class="p">(){</span>
</span></span><span class="line"><span class="cl">		<span class="nx">gs</span><span class="p">.</span><span class="nx">info</span><span class="p">(</span><span class="s2">&#34;value of setInit in myfunction: &#34;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">setInit</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="k">this</span><span class="p">.</span><span class="nx">myOtherFunction</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">	<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="nx">myOtherFunction</span> <span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">callBack</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">		<span class="nx">gs</span><span class="p">.</span><span class="nx">info</span><span class="p">(</span><span class="s2">&#34;value of setInit in myOtherFunction: &#34;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">setInit</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;test&#39;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><h2 id="this-context-is-lost-when-calling-a-function-given-as-a-parameter-to-another-function"><code>this</code> context is lost when calling a function given as a parameter to another function</h2>
<p>Now let&rsquo;s imagine with we need to pass a function as an argument to another function:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl">	 <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">this</span><span class="p">.</span><span class="nx">setInit</span><span class="o">=</span> <span class="s2">&#34;Set in init&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">     <span class="p">},</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">doFunction</span> <span class="o">:</span> <span class="kd">function</span> <span class="p">(){</span>
</span></span><span class="line"><span class="cl">		<span class="nx">gs</span><span class="p">.</span><span class="nx">info</span><span class="p">(</span><span class="s2">&#34;value of setInit in doFunction: &#34;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">setInit</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="k">this</span><span class="p">.</span><span class="nx">processFunction</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">postProcessFunction</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		
</span></span><span class="line"><span class="cl">	<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="nx">processFunction</span> <span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">callBack</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">		<span class="nx">gs</span><span class="p">.</span><span class="nx">info</span><span class="p">(</span><span class="s2">&#34;value of setInit in processFunction: &#34;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">setInit</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="nx">postProcessFunction</span><span class="p">(</span><span class="s2">&#34;from processfunction&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="nx">postProcessFunction</span> <span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">text</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// now this. is not referencing to the global context of the script inclue
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="nx">gs</span><span class="p">.</span><span class="nx">info</span><span class="p">(</span><span class="s2">&#34;value of setInit in processFunction: &#34;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">setInit</span><span class="p">);</span> <span class="c1">// can not access the value defined
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="k">this</span><span class="p">.</span><span class="nx">doSomethingElseFunction</span> <span class="p">(</span><span class="s2">&#34;fromProcessfunction&#34;</span><span class="p">);</span> <span class="c1">// can not call this function
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="nx">doSomethingElseFunction</span> <span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">text</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">gs</span><span class="p">.</span><span class="nx">info</span><span class="p">(</span><span class="nx">text</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span></code></pre></div><p>In order to solve this, we need to indicate that we want that the function <code>postProcessFunction</code> provided as an argument to <code>processFunction</code> has its <code>this</code>keyword set to the correct value, which is the global context.</p>
<h2 id="adding-the-bind-method-to-bound-the-context-to-the-function">Adding the <code>bind</code> method to bound the context to the function</h2>
<p>To do so, we need to add <code>.bind</code> method when passing the function as a parameter to <code>processFunction</code>, with the current context which is <code>this</code> :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"> 	<span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">this</span><span class="p">.</span><span class="nx">setInit</span><span class="o">=</span> <span class="s2">&#34;Set in init&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">     <span class="p">},</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">doFunction</span> <span class="o">:</span> <span class="kd">function</span> <span class="p">(){</span>
</span></span><span class="line"><span class="cl">		<span class="nx">gs</span><span class="p">.</span><span class="nx">info</span><span class="p">(</span><span class="s2">&#34;value of setInit in doFunction: &#34;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">setInit</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="c1">// Here we add the .bind method, with this as an argument
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="k">this</span><span class="p">.</span><span class="nx">processFunction</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">postProcessFunction</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="k">this</span><span class="p">));</span> 
</span></span><span class="line"><span class="cl">		
</span></span><span class="line"><span class="cl">	<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="nx">processFunction</span> <span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">callBack</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">		<span class="nx">gs</span><span class="p">.</span><span class="nx">info</span><span class="p">(</span><span class="s2">&#34;value of setInit in processFunction: &#34;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">setInit</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="nx">postProcessFunction</span><span class="p">(</span><span class="s2">&#34;from processfunction&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="nx">postProcessFunction</span> <span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">text</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// now this. IS referencing to the global context of the script inclue
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="nx">gs</span><span class="p">.</span><span class="nx">info</span><span class="p">(</span><span class="s2">&#34;value of setInit in processFunction: &#34;</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">setInit</span><span class="p">);</span> <span class="c1">// CAN access the value defined
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="k">this</span><span class="p">.</span><span class="nx">doSomethingElseFunction</span> <span class="p">(</span><span class="s2">&#34;fromProcessfunction&#34;</span><span class="p">);</span> <span class="c1">// CAN call this function
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="nx">doSomethingElseFunction</span> <span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">text</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">gs</span><span class="p">.</span><span class="nx">info</span><span class="p">(</span><span class="nx">text</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span></code></pre></div><h2 id="real-life-usage-example">Real life usage example</h2>
<p>You may wonder what are real world use cases, so let me describe you one situation where I used <em>this</em>.</p>
<p>I needed to call REST messages for various interfaces. The bulk of the REST messages call is common to all, just the message name and the actions to perform after a successful execution or after an error where different.</p>
<p>To do so, I used functions as in simplified example below.</p>
<p>The function called to trigger the interface is <code>getUserDetails</code>. It then call the <code>executeRestMessage</code> with the REST message name and the post processing function and the error processing function as parameter. Note there the <code>bind</code> used when passing the function as a parameter.</p>
<p>The in the real case, there is multiple functions similar as <code>getUserDetails</code> and the logic is a bit more complexe.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl">	  <span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm">      	@name getUserDetails
</span></span></span><span class="line"><span class="cl"><span class="cm">      	@description Trigger the integration for getUserDetails
</span></span></span><span class="line"><span class="cl"><span class="cm">     */</span>
</span></span><span class="line"><span class="cl">    <span class="nx">getUserDetails</span> <span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1">// call the execute MEssage for this interface and with the function. Note the &#34;bind&#34; used.
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="k">this</span><span class="p">.</span><span class="nx">executeMessage</span><span class="p">(</span><span class="s2">&#34;users&#34;</span><span class="p">,</span> <span class="s2">&#34;getUserDetails&#34;</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">getUserDetails_postProcess</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="k">this</span><span class="p">),</span> <span class="k">this</span><span class="p">.</span><span class="nx">getUserDetails_errorProcess</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="k">this</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">	<span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm">		@name executeRestMessage
</span></span></span><span class="line"><span class="cl"><span class="cm">		@description Execute the given REST message.If provided add string to endpoint and add query paramters. Then execute the given post process function.
</span></span></span><span class="line"><span class="cl"><span class="cm">		@param {String} [messageName] - Name of the REST message
</span></span></span><span class="line"><span class="cl"><span class="cm">		@param {String} [methodName] - Name of the http method 
</span></span></span><span class="line"><span class="cl"><span class="cm">		@param {function} {postProcessFunction} - Function to execution afer sucessfull execution of the REST Message
</span></span></span><span class="line"><span class="cl"><span class="cm">		@param {function} [errorProcessFunction] - Function to execution afer error in execution of the REST Message
</span></span></span><span class="line"><span class="cl"><span class="cm">	*/</span>
</span></span><span class="line"><span class="cl">	<span class="nx">executeRestMessage</span> <span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">messageName</span><span class="p">,</span> <span class="nx">methodName</span><span class="p">,</span> <span class="nx">postProcessFunction</span><span class="p">,</span> <span class="nx">errorProcessFunction</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// get REST message
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="kd">var</span> <span class="nx">message</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">sn_ws</span><span class="p">.</span><span class="nx">RESTMessageV2</span><span class="p">(</span><span class="nx">messageName</span><span class="p">,</span> <span class="nx">methodName</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1">// execute message
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>         <span class="kd">var</span> <span class="nx">response</span> <span class="o">=</span> <span class="nx">message</span><span class="p">.</span><span class="nx">execute</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="c1">// get http status from the response
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="kd">var</span> <span class="nx">httpStatus</span> <span class="o">=</span> <span class="nx">response</span><span class="p">.</span><span class="nx">getStatusCode</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">               
</span></span><span class="line"><span class="cl">        <span class="c1">// in case of success, call the postProcessFunction
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="k">if</span> <span class="p">(</span><span class="nx">httpStatus</span> <span class="o">==</span> <span class="s1">&#39;200&#39;</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">            <span class="nx">postProcessFunction</span><span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">getBody</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// or in case of error, call errorProcessFunction
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>            <span class="nx">errorProcessFunction</span><span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">getBody</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">     <span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm">      	@name getUserDetails_postProcess
</span></span></span><span class="line"><span class="cl"><span class="cm">      	@description Post processing for getUserDetails
</span></span></span><span class="line"><span class="cl"><span class="cm">      	@param {String} [responseBody] - Response body from REST execution
</span></span></span><span class="line"><span class="cl"><span class="cm">     */</span>
</span></span><span class="line"><span class="cl">	<span class="nx">getUserDetails_postProcess</span> <span class="p">(</span><span class="nx">responseBody</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// do post processing, update record, etc. &#34;this&#34; is accessible if needed
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        
</span></span><span class="line"><span class="cl">    <span class="p">},</span> 
</span></span><span class="line"><span class="cl">    <span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm">      	@name getUserDetails_errorProcess
</span></span></span><span class="line"><span class="cl"><span class="cm">      	@description Error processing for getUserDetails
</span></span></span><span class="line"><span class="cl"><span class="cm">      	@param {String} [responseBody] - Response body from REST execution
</span></span></span><span class="line"><span class="cl"><span class="cm">     */</span>
</span></span><span class="line"><span class="cl">    <span class="nx">getUserDetails_errorProcess</span><span class="p">(</span><span class="nx">responseBody</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// do error processing (create incident, log message, etc..). &#34;this&#34; is accessible if needed
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="p">}</span>    
</span></span></code></pre></div><p>I hope you find this information and this example usefull. Please fell free to leave any message or to open a discussion on this topic in the comments below.</p>
<h2 id="references">References</h2>
<ol>
<li>Marijn Haverbeke, Eloquent JavaScript, 3rd edition,<a href="https://eloquentjavascript.net/Eloquent_JavaScript.pdf">https://eloquentjavascript.net/Eloquent_JavaScript.pdf</a>, 2018</li>
<li>Mozilla, MDM web docs, Function.prototype.bind(), <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind">https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind</a>, 2020 04 29</li>
<li>Alex Devro, Blog, How &ldquo;this&rdquo; in javaScript work,<a href="https://blog.alexdevero.com/this-in-javascript-works/"> https://blog.alexdevero.com/this-in-javascript-works/</a>, 2020 04 20</li>
</ol>]]></content:encoded>
    </item>
    
  </channel>
</rss>
