<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Eli Perelman]]></title>
  <link href="http://eliperelman.github.com/atom.xml" rel="self"/>
  <link href="http://eliperelman.github.com/"/>
  <updated>2011-12-22T11:40:19-06:00</updated>
  <id>http://eliperelman.github.com/</id>
  <author>
    <name><![CDATA[Eli Perelman]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[New JS Logo (logo.js) badges]]></title>
    <link href="http://eliperelman.github.com/blog/2011/12/18/new-js-logo-logo-dot-js-badges/"/>
    <updated>2011-12-18T17:30:00-06:00</updated>
    <id>http://eliperelman.github.com/blog/2011/12/18/new-js-logo-logo-dot-js-badges</id>
    <content type="html"><![CDATA[<p>I have put together a small set of JS logo badges based on the original JS logo by <a href="https://github.com/voodootikigod/logo.js">voodootikigod on GitHub</a>. I was looking for a more stylized version of the logo.js suitable for display as a badge on sites and couldn&#8217;t really find anything, so I made these for anyone to use. They are under the same license as the originals, available in 512x512, 256x256, 128x128, and 64x64 sizes:</p>

<p><a href="https://github.com/eliperelman/logo.js/blob/master/js.badges.zip?raw=true">JS Logo Badges download</a></p>

<p><strong>UPDATE</strong></p>

<p>Some have asked for a sticker of this badge, so here you go! All proceeds from the sale of this sticker will be donated to <a href="http://www.crowdrise.com/TeamJS">TeamJS for Feeding America</a>:</p>

<p><a href="http://www.redbubble.com/people/eliperelman/works/8233383-js-logo-badge">JS Logo Badge Sticker on RedBubble</a></p>

<p><img src="http://eliperelman.github.com/images/js_preview.png" alt="JS badges" /></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[JavaScript API Design]]></title>
    <link href="http://eliperelman.github.com/blog/2011/12/12/javascript-api-design/"/>
    <updated>2011-12-12T18:31:00-06:00</updated>
    <id>http://eliperelman.github.com/blog/2011/12/12/javascript-api-design</id>
    <content type="html"><![CDATA[<p>Consuming third-party JavaScript APIs (some like to call them SDKs) from some authors can be somewhat of a pain. Many are poorly documented, unintuitive to work with, and don&#8217;t provide enough hooks to be useful in many situations. Today I&#8217;m going to go over my guide for building great JavaScript APIs.</p>

<!--more-->


<h2>Resourceful</h2>

<p>In REST, URLs are constructed with actions primary revolving around a resource. For example, if we wanted to fetch a user from a server, our URL might look like <code>http://localhost/users/12345</code>, where <code>users</code> is our collection container pointing to the <code>user</code> resource. REST is very popular because URLs are human readable; we can make a pretty good guess of what is happening behind the scenes just by the URL structure.</p>

<p>Making our APIs resource-oriented is very similar to being object-oriented, and so our ultimate goal is for our methods to describe objects and entities, not actions. In many userscripts you might see something like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">Twitter</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Twitter</span><span class="p">.</span><span class="nx">search</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span> <span class="nx">keyword</span><span class="p">,</span> <span class="nx">callback</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// API implementation</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// And called like so:</span>
</span><span class='line'><span class="nx">Twitter</span><span class="p">.</span><span class="nx">search</span><span class="p">(</span> <span class="s1">&#39;lolcats&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span> <span class="nx">results</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// Here we can iterate over the tweet results</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is supposed to be an API for querying Twitter tweets via JavaScript. While the script may be operational, it is contrary to our goal of being resource-oriented because the method is called <code>search</code>. How can we make this resource-oriented? By describing what we want back, not what we are doing:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">Twitter</span> <span class="o">=</span> <span class="p">{};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Twitter</span><span class="p">.</span><span class="nx">tweets</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span> <span class="nx">keyword</span><span class="p">,</span> <span class="nx">callback</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// API implementation</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// And called like so:</span>
</span><span class='line'><span class="nx">Twitter</span><span class="p">.</span><span class="nx">tweets</span><span class="p">(</span> <span class="s1">&#39;lolcats&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span> <span class="nx">results</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// Here we can iterate over the tweet results</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Our API now describes a resources and not an action. Depending on how you form your API, you could change the naming pattern and still be resourceful:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">Twitter</span><span class="p">.</span><span class="nx">tweets</span><span class="p">(</span> <span class="s1">&#39;lolcats&#39;</span><span class="p">,</span> <span class="nx">handler</span> <span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Tweets</span><span class="p">(</span> <span class="s1">&#39;lolcats&#39;</span><span class="p">,</span> <span class="nx">handler</span> <span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Tweets</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span> <span class="s1">&#39;lolcats&#39;</span><span class="p">,</span> <span class="s1">&#39;handler&#39;</span> <span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now take a moment to look at that last example. You can see that our method call is an action. Isn&#8217;t this contrary to what we just said? Not really, because the object we are calling it on directly describes the resource we are getting. Just like in REST, actions (HTTP verbs) determine the representation of a resource; in designing our API we can take advantage of this naming style to improve several aspects of our API.</p>

<h2>Readability / Self-Documenting</h2>

<p>In the previous paragraph, I mentioned that our naming conventions can improve our API, and one of those aspects is readability. Take this API for instance:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">Twitter</span><span class="p">.</span><span class="nx">search</span><span class="p">(</span> <span class="s1">&#39;lolcats&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span> <span class="nx">results</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span> <span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">results</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span> <span class="s1">&#39;.tweet-container&#39;</span> <span class="p">).</span><span class="nx">append</span><span class="p">(</span> <span class="nx">results</span><span class="p">[</span> <span class="nx">i</span> <span class="p">].</span><span class="nx">message</span> <span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>This single method is doing quite a bit. It performs a search, returns the results, and appends each of those results to the DOM. Readability score: 0. We can design our API better than this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">Tweets</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">get</span><span class="p">(</span> <span class="s1">&#39;lolcats&#39;</span> <span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">done</span><span class="p">(</span> <span class="kd">function</span> <span class="p">(</span> <span class="nx">results</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">for</span> <span class="p">(</span> <span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">results</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">$</span><span class="p">(</span> <span class="s1">&#39;.tweet-container&#39;</span> <span class="p">).</span><span class="nx">append</span><span class="p">(</span> <span class="nx">results</span><span class="p">[</span> <span class="nx">i</span> <span class="p">].</span><span class="nx">message</span> <span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Definitely better. We have split the fetching of results from the processing of the results, and improved the readability of interacting with the API by allowing the results to chain through a Promise-style interface. You could even take this a step further and provide an asynchronous iterating mechanism to process tweets when the results come back. This will save the user from having to build a loop for every call to get tweets:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">Tweets</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">get</span><span class="p">(</span> <span class="s1">&#39;lolcats&#39;</span> <span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">each</span><span class="p">(</span> <span class="kd">function</span><span class="p">(</span> <span class="nx">tweet</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// Ideally you would append this in one chunk, but this is just an example :)</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span> <span class="s1">&#39;.tweet-container&#39;</span> <span class="p">).</span><span class="nx">append</span><span class="p">(</span> <span class="nx">tweet</span><span class="p">.</span><span class="nx">message</span> <span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Very clean and easy to read.</p>

<h2>Unobtrusive</h2>

<p>Our next goal is to be unobtrusive, and by that I mean leave the user and their code alone:</p>

<ol>
<li><p>The API should only be accessible through one global variable, which leads to #2:</p></li>
<li><p>Do not leak variables into the global scope.</p></li>
<li><p>Provide the user a way to put your API into a <strong>no conflict</strong> mode.</p>

<p> If you have a global variable for the fetching of tweets, such as <code>Tweets</code>, allow the user to easily remove the global variable and make it a part of their application. Many APIs do something like this:</p>

<pre><code> &lt;script src="http://eliperelman.github.com/scripts/tweets.js"&gt;&lt;/script&gt;
 &lt;script&gt;
     App.tweets = Tweets.noConflict();
 &lt;/script&gt;
</code></pre>

<p> Calling <code>.noConflict()</code> on the API will remove the <code>Tweets</code> namespace and return all its original functionality, which the consuming application uses to extend their own application. Unobtrusive win.</p></li>
<li><p>Unless the specific purpose of your API is DOM manipulation, don&#8217;t do it.</p>

<p> With our Twitter API example, avoid forming the API like this:</p>

<pre><code> Tweets
     .get( 'lolcats' )
     .appendTo( $('#twitter-container')[0] );
</code></pre>

<p> Working with the DOM is outside the scope of your API, and even though it may be convenient, your mechanism may not be able to handle all the use cases users may need when working with the DOM. Best to just provide them as easy a mechanism as possible for getting your API data into the DOM.</p></li>
<li><p>If possible, avoid creating or changing events in userland code. Provide hooks instead.</p></li>
<li><p>Reduce or eliminate dependencies.</p>

<p> It is not a good practice to always assume that the user of your API will always have jQuery available or doesn&#8217;t need IE7 support. Remember these things when creating your API. The goal is to reduce dependencies, which has positives and negatives. Eliminating dependencies reduces having to manage upgrades and bugs outside your control, keeps users from having to manage this as well, and also opens up the amount of users able to consume your API. If you force your users to have jQuery in order to consume the API, you could lock out many developers who cannot use jQuery or will not for many reasons. It is best to eliminate dependencies as much as possible.</p>

<p> That being said, having dependencies could reduce the amount of code you need to write, whether that be from offloading tasks to another third-party script or lessen the amount of cross-browser compatibility code. Browser support also comes into play here. Make reasonable decisions on the what browsers you are able to reasonably support up front, and maybe attempt to support more browsers in the future.</p></li>
</ol>


<h2>Extensible and Granular</h2>

<p>I cannot tell you how many times I have used third-party plugins and APIs and not have them work exactly as needed. As a JS API developer, it is almost impossible to forsee all the situations, environments, and quirks that your script may have to work within. API consumers will know much more about their environment than you, so the easiest solution is provide hooks into your API that a user can latch onto and seize control of a situation. Create as many hooks as possible, even though they may not seem valuable to you at the moment. For example, you could use an event-style system to give the API consumer the ability to make changes at critical stages in the pipeline:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">Tweets</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">on</span><span class="p">(</span> <span class="s1">&#39;beforeget&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span> <span class="nx">context</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span> <span class="o">!</span><span class="nx">context</span><span class="p">.</span><span class="nx">keyword</span> <span class="o">||</span> <span class="nx">context</span><span class="p">.</span><span class="nx">keyword</span> <span class="o">===</span> <span class="s1">&#39;coffeescript&#39;</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">context</span><span class="p">.</span><span class="nx">abort</span><span class="p">();</span>
</span><span class='line'>      <span class="p">}</span>    
</span><span class='line'>  <span class="p">})</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">on</span><span class="p">(</span> <span class="s1">&#39;afterget&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span> <span class="nx">context</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">context</span><span class="p">.</span><span class="nx">results</span> <span class="o">=</span> <span class="nx">context</span><span class="p">.</span><span class="nx">results</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span> <span class="kd">function</span> <span class="p">(</span> <span class="nx">tweet</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>          <span class="k">return</span> <span class="nx">tweet</span><span class="p">.</span><span class="nx">message</span><span class="p">;</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>  <span class="p">})</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">on</span><span class="p">(</span> <span class="s1">&#39;error&#39;</span><span class="p">,</span> <span class="kd">function</span> <span class="p">(</span> <span class="nx">context</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span> <span class="s1">&#39;Tweet FAIL.&#39;</span> <span class="p">);</span>
</span><span class='line'>  <span class="p">})</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">get</span><span class="p">(</span> <span class="s1">&#39;lolcats&#39;</span> <span class="p">)</span>
</span><span class='line'>  <span class="p">.</span><span class="nx">each</span><span class="p">(</span> <span class="kd">function</span> <span class="p">(</span> <span class="nx">tweet</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span> <span class="s1">&#39;.tweet-container&#39;</span> <span class="p">).</span><span class="nx">append</span><span class="p">(</span> <span class="nx">tweet</span> <span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>By providing hooks into the entire lifecycle of a method call in our API, we can allow the user to do incredible processing with easy mechanisms. Integration into existing applications is made much easier if you provide hooks into your API <strong>everywhere</strong> possible.</p>

<h2>Consistency / Conventions</h2>

<p>Last but not least, if you adopt a style for your API, make sure that style is consistent across the entire codebase. Users can become very aggravated if they become accustomed to interacting with the API in one way, only to have to switch styles when working on another method from it. Pick a style and stick with it.</p>

<h2>Conclusion</h2>

<p>Designing JavaScript APIs can sometimes be difficult, but building them in these ways will ensure that you have made your API as friendly, intuitive, and powerful as possible.</p>

<p>Have I missed or would you add anything to this list?</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Handling Google's Ajax-Crawling Hashbang (#!) Navigation in ASP.NET MVC 3]]></title>
    <link href="http://eliperelman.github.com/blog/2011/10/06/handling-googles-ajax-crawling-hashbang-number-navigation-in-asp-dot-net-mvc-3/"/>
    <updated>2011-10-06T09:38:00-05:00</updated>
    <id>http://eliperelman.github.com/blog/2011/10/06/handling-googles-ajax-crawling-hashbang-number-navigation-in-asp-dot-net-mvc-3</id>
    <content type="html"><![CDATA[<p>Having neato &#8220;single-page&#8221; websites using ajax navigation is the fun thing to do with websites lately, but it can pose a problem with search-engine indexing and SEO. The problem stems from search engines not executing JavaScript on webpages, and because the JavaScript won&#8217;t run, your pages won&#8217;t be indexed.</p>

<!--more-->


<p>But never fear, <a href="http://code.google.com/web/ajaxcrawling/docs/getting-started.html">Google came up with a scheme</a> to index pages that are normally hidden behind an ajax request.  To summarize, by placing a hashbang (<code>#!</code>) in your URL, Google will swap that with a query string identifier of <code>?_escaped_fragment_=</code> when trying to crawl your pages.</p>

<p>For example, let&#8217;s take the Account Registration page built into ASP.NET MVC 3. When creating a new project, on the home page there exists a link to this page: <code>http://mysite.com/account/register</code>. Now, when converting the site to be a single-page application (using ajax to navigate), we need to change the URL that retrieves this page to <code>http://mysite.com/#!/account/register</code>. You then use some sort of JavaScript solution (like Ben Alman&#8217;s jQuery BBQ plugin) to handle requests based on the <code>hashchange</code> event.</p>

<p>When Google tries to index the Account Registration page, it will change the URL (since the browser will not send the URL hash to the server for processing) to this: <code>http://mysite.com/?_escaped_fragment_=/account/register</code>. They try to follow the URL, and now it&#8217;s up to the server to fetch and return the full page to Google for indexing. I will show you my solution to solving this in ASP.NET MVC 3.</p>

<p>With Global Action Filters in MVC, we have the ability to intercept all responses before it goes to a Controller Action for execution. By doing this, we can check to see if Google&#8217;s fragment exists in the URL and reroute as needed. We will start by creating a new class:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">AjaxCrawlableAttribute</span> <span class="p">:</span> <span class="n">ActionFilterAttribute</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>By inheriting from <code>ActionFilterAttribute</code>, we are now able to register our class as a Global Action Filter in Global.asax, but we will handle that later. Let&#8217;s keep going by intercepting some requests:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">AjaxCrawlableAttribute</span> <span class="p">:</span> <span class="n">ActionFilterAttribute</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">public</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">OnActionExecuting</span><span class="p">(</span><span class="n">ActionExecutingContext</span> <span class="n">filterContext</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>By overriding the <code>OnActionExecuting</code> method, we are telling ASP.NET we want to intercept the request <em>BEFORE</em> the request is sent to the Controller for processing. Now we can start to work on the magic:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">AjaxCrawlableAttribute</span> <span class="p">:</span> <span class="n">ActionFilterAttribute</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">private</span> <span class="k">const</span> <span class="kt">string</span> <span class="n">Fragment</span> <span class="p">=</span> <span class="s">&quot;_escaped_fragment_&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">OnActionExecuting</span><span class="p">(</span><span class="n">ActionExecutingContext</span> <span class="n">filterContext</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>      <span class="n">var</span> <span class="n">request</span> <span class="p">=</span> <span class="n">filterContext</span><span class="p">.</span><span class="n">RequestContext</span><span class="p">.</span><span class="n">HttpContext</span><span class="p">.</span><span class="n">Request</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="kt">string</span><span class="p">.</span><span class="n">IsNullOrWhiteSpace</span><span class="p">(</span><span class="n">request</span><span class="p">.</span><span class="n">QueryString</span><span class="p">[</span><span class="n">Fragment</span><span class="p">]))</span>
</span><span class='line'>          <span class="k">return</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>First up, we grab the current Request and check the query string to see if it contains Google&#8217;s magical fragment identifier. Since the method is going to execute on every request (even child requests), we want to exit this method the moment we know we are not dealing with a search engine.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">AjaxCrawlableAttribute</span> <span class="p">:</span> <span class="n">ActionFilterAttribute</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">private</span> <span class="k">const</span> <span class="kt">string</span> <span class="n">Fragment</span> <span class="p">=</span> <span class="s">&quot;_escaped_fragment_&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">OnActionExecuting</span><span class="p">(</span><span class="n">ActionExecutingContext</span> <span class="n">filterContext</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>      <span class="n">var</span> <span class="n">request</span> <span class="p">=</span> <span class="n">filterContext</span><span class="p">.</span><span class="n">RequestContext</span><span class="p">.</span><span class="n">HttpContext</span><span class="p">.</span><span class="n">Request</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="kt">string</span><span class="p">.</span><span class="n">IsNullOrWhiteSpace</span><span class="p">(</span><span class="n">request</span><span class="p">.</span><span class="n">QueryString</span><span class="p">[</span><span class="n">Fragment</span><span class="p">]))</span>
</span><span class='line'>          <span class="k">return</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">var</span> <span class="n">parts</span> <span class="p">=</span> <span class="n">request</span><span class="p">.</span><span class="n">QueryString</span><span class="p">[</span><span class="n">Fragment</span><span class="p">].</span><span class="n">Split</span><span class="p">(</span><span class="k">new</span><span class="p">[]</span> <span class="p">{</span><span class="sc">&#39;/&#39;</span><span class="p">},</span> <span class="n">StringSplitOptions</span><span class="p">.</span><span class="n">RemoveEmptyEntries</span><span class="p">);</span>
</span><span class='line'>      <span class="n">var</span> <span class="n">routeValues</span> <span class="p">=</span> <span class="k">new</span> <span class="n">AjaxRoute</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">parts</span><span class="p">.</span><span class="n">Length</span> <span class="p">&gt;</span> <span class="m">0</span><span class="p">)</span>
</span><span class='line'>          <span class="n">routeValues</span><span class="p">.</span><span class="n">Controller</span> <span class="p">=</span> <span class="n">parts</span><span class="p">[</span><span class="m">0</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">parts</span><span class="p">.</span><span class="n">Length</span> <span class="p">&gt;</span> <span class="m">1</span><span class="p">)</span>
</span><span class='line'>          <span class="n">routeValues</span><span class="p">.</span><span class="n">Action</span> <span class="p">=</span> <span class="n">parts</span><span class="p">[</span><span class="m">1</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">parts</span><span class="p">.</span><span class="n">Length</span> <span class="p">&gt;</span> <span class="m">2</span><span class="p">)</span>
</span><span class='line'>          <span class="n">routeValues</span><span class="p">.</span><span class="n">Id</span> <span class="p">=</span> <span class="n">parts</span><span class="p">[</span><span class="m">2</span><span class="p">];</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Adding a little more code here, I take the value of the query string parameter and split it on <code>/</code> so that we can have the parts of the URL that determine what action to go to. I have created another class, <code>AjaxRoute</code>, to be a container of these values:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">AjaxRoute</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">public</span> <span class="kt">string</span> <span class="n">Controller</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>  <span class="k">public</span> <span class="kt">string</span> <span class="n">Action</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>  <span class="k">public</span> <span class="kt">string</span> <span class="n">Id</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This class has very specific properties, because the names of the properties will be used to determine what route values we need for the routing. Since for this example we are only using the default MVC route, these are the only route parameters we need to set in order to get to the right Controller Action.</p>

<p>To finish this implementation off, we only need one more line, and it&#8217;s the line that tells MVC to reroute to the controller matching the route values we have set:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">AjaxCrawlableAttribute</span> <span class="p">:</span> <span class="n">ActionFilterAttribute</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">private</span> <span class="k">const</span> <span class="kt">string</span> <span class="n">Fragment</span> <span class="p">=</span> <span class="s">&quot;_escaped_fragment_&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">public</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">OnActionExecuting</span><span class="p">(</span><span class="n">ActionExecutingContext</span> <span class="n">filterContext</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>      <span class="n">var</span> <span class="n">request</span> <span class="p">=</span> <span class="n">filterContext</span><span class="p">.</span><span class="n">RequestContext</span><span class="p">.</span><span class="n">HttpContext</span><span class="p">.</span><span class="n">Request</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="kt">string</span><span class="p">.</span><span class="n">IsNullOrWhiteSpace</span><span class="p">(</span><span class="n">request</span><span class="p">.</span><span class="n">QueryString</span><span class="p">[</span><span class="n">Fragment</span><span class="p">]))</span>
</span><span class='line'>          <span class="k">return</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">var</span> <span class="n">parts</span> <span class="p">=</span> <span class="n">request</span><span class="p">.</span><span class="n">QueryString</span><span class="p">[</span><span class="n">Fragment</span><span class="p">].</span><span class="n">Split</span><span class="p">(</span><span class="k">new</span><span class="p">[]</span> <span class="p">{</span><span class="sc">&#39;/&#39;</span><span class="p">},</span> <span class="n">StringSplitOptions</span><span class="p">.</span><span class="n">RemoveEmptyEntries</span><span class="p">);</span>
</span><span class='line'>      <span class="n">var</span> <span class="n">routeValues</span> <span class="p">=</span> <span class="k">new</span> <span class="n">AjaxRoute</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">parts</span><span class="p">.</span><span class="n">Length</span> <span class="p">&gt;</span> <span class="m">0</span><span class="p">)</span>
</span><span class='line'>          <span class="n">routeValues</span><span class="p">.</span><span class="n">Controller</span> <span class="p">=</span> <span class="n">parts</span><span class="p">[</span><span class="m">0</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">parts</span><span class="p">.</span><span class="n">Length</span> <span class="p">&gt;</span> <span class="m">1</span><span class="p">)</span>
</span><span class='line'>          <span class="n">routeValues</span><span class="p">.</span><span class="n">Action</span> <span class="p">=</span> <span class="n">parts</span><span class="p">[</span><span class="m">1</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">parts</span><span class="p">.</span><span class="n">Length</span> <span class="p">&gt;</span> <span class="m">2</span><span class="p">)</span>
</span><span class='line'>          <span class="n">routeValues</span><span class="p">.</span><span class="n">Id</span> <span class="p">=</span> <span class="n">parts</span><span class="p">[</span><span class="m">2</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">filterContext</span><span class="p">.</span><span class="n">Result</span> <span class="p">=</span> <span class="k">new</span> <span class="n">RedirectToRouteResult</span><span class="p">(</span><span class="k">new</span> <span class="n">RouteValueDictionary</span><span class="p">(</span><span class="n">routeValues</span><span class="p">));</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">public</span> <span class="k">class</span> <span class="nc">AjaxRoute</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">public</span> <span class="kt">string</span> <span class="n">Controller</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>  <span class="k">public</span> <span class="kt">string</span> <span class="n">Action</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>  <span class="k">public</span> <span class="kt">string</span> <span class="n">Id</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Setting the <code>filterContext</code> result will now reroute to the proper Controller and return the full view that Google is looking for. One last order of business is to register our attribute as a Global Action Filter, thereby making it execute on every request. Add the following line in the <code>RegisterGlobalFilters</code> method in Global.asax:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='csharp'><span class='line'><span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">RegisterGlobalFilters</span><span class="p">(</span><span class="n">GlobalFilterCollection</span> <span class="n">filters</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">filters</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">HandleErrorAttribute</span><span class="p">());</span>
</span><span class='line'>  <span class="c1">// Add this line here:</span>
</span><span class='line'>  <span class="n">filters</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">AjaxCrawlableAttribute</span><span class="p">());</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>And there you have it! Now every time Google crawls your ajaxified single-page website, it can index each page separately successfully.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[HDC 2011 OpenRasta RESTful Services and jQuery Consumption]]></title>
    <link href="http://eliperelman.github.com/blog/2011/09/07/hdc-2011-openrasta-restful-services-and-jquery-consumption/"/>
    <updated>2011-09-07T14:04:00-05:00</updated>
    <id>http://eliperelman.github.com/blog/2011/09/07/hdc-2011-openrasta-restful-services-and-jquery-consumption</id>
    <content type="html"><![CDATA[<p><a href="http://prezi.com/v_qwdlegnrea/openrasta-restful-services-and-jquery-consumption/">HDC 2011 OpenRasta RESTful Services and jQuery Consumption</a></p>

<p><a href="http://vimeo.com/28848303">REST Introduction Video</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Every Developer Has Two Full Time Jobs]]></title>
    <link href="http://eliperelman.github.com/blog/2011/08/29/every-developer-has-two-full-time-jobs/"/>
    <updated>2011-08-29T18:50:00-05:00</updated>
    <id>http://eliperelman.github.com/blog/2011/08/29/every-developer-has-two-full-time-jobs</id>
    <content type="html"><![CDATA[<p>A good read on the importance of a developer to stay sharp in their skills. It also helps to be able to predict where the market will be 6 months from when you plan to leave a job, but that takes a different skill&#8230;</p>

<p><a href="http://goo.gl/4Wqfz">Every Developer Has Two Full Time Jobs</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A jQuery User's Guide to REST]]></title>
    <link href="http://eliperelman.github.com/blog/2011/08/17/a-jquery-users-guide-to-rest/"/>
    <updated>2011-08-17T11:47:00-05:00</updated>
    <id>http://eliperelman.github.com/blog/2011/08/17/a-jquery-users-guide-to-rest</id>
    <content type="html"><![CDATA[<p>Being a JavaScript developer often means that you are left out of any discussions related to server-side code or architecture. Eventually this could present a usability or maintainability problem, and I&#8217;d like to bring up why you should care in regards to the topic of REST.</p>

<!--more-->


<p><strong>REST</strong>, or Representational State Transfer, can be thought of as a standard way for two parties to communicate about the actions to take on a resource or set of resources. To understand REST, let&#8217;s try to break this down into an analogy.</p>

<h3>Resources</h3>

<p><img src="http://media.tumblr.com/tumblr_lq2rqogcRT1qg5j0h.jpg" alt="" /></p>

<p>Yes, that&#8217;s right. Cheese. Cheese, for all intensive purposes, will be our <em>resource</em>. Think of a resource as a noun, an item. Something you can interact with, but not the action itself. Going back to grammar lessons, a noun can be a person, place, thing, or idea. That same principal applies to resources as well.</p>

<h3>Verbs</h3>

<p>Now, what can you do with cheese? You can make cheese, cut it (pun intended), store it, and yes, even eat it. These are all actions you can take on cheese. HTTP defines a standard set of actions that can be performed against all resources, called <em>verbs</em>, and today I am only going to focus on the four most supported ones: <strong>GET</strong>, <strong>POST</strong>, <strong>PUT</strong>, and <strong>DELETE</strong>.</p>

<h3>URLs</h3>

<p>In order to communicate with the server for your cheese interaction, you need to understand how to combine resources and verbs to form a request.</p>

<h3>Pluarlity</h3>

<p>The generally accepted way to identify a resource action in a URL is to use its plural form. For cheese it would be cheeses, user would be users, radius would be radii, and so on. Keep plurality in mind when forming your URL.</p>

<h3>Forming the request</h3>

<p>When browsing the internet, each request from page to page is a <em>GET</em> request. This same concept applies to accessing pages RESTfully. For example, if we want to go to a page that contains a list of all our cheeses, the URL would look like this:</p>

<p><img src="http://media.tumblr.com/tumblr_lq2wpb5xrT1qg5j0h.png" alt="" /></p>

<p>Notice there is no action stating we want to get a list like <code>http://localhost/cheeses/getall</code> or something similar. The action is provided by HTTP, so we don&#8217;t need to pollute our URL with it. This is what REST is all about.</p>

<p>Making any request, I get back a <em><em>representation</em> of the resource based on what resource I am requesting and the action I am performing on it. Since I am using my browser, I am using the </em>GET<em> verb to request the cheeses resources. Using that syntax, I should expect that the </em>representation_ would be a list of cheeses, maybe in a table.</p>

<p>Now, let&#8217;s access a single piece of cheese:</p>

<p><img src="http://media.tumblr.com/tumblr_lq2wqawi1l1qg5j0h.png" alt="" /></p>

<p>Notice I am still working with my resource of cheeses, but this time I am providing the name or id of the cheese resource. Using the browser&#8217;s address bar will execute this as a <em>GET</em> request, so I will receive a page representation of a single cheese resource, possibly a form for editing this piece of cheese.</p>

<h3>jQuery, AJAX, and other verbs</h3>

<p>In the earlier days of web development before AJAX (yes, it&#8217;s true, it did exist at one point), there was not much of a concept of posting a form asynchronously, e.g. submitting a form would take you to another page.  This was accomplished through a combination of a form tag&#8217;s <code>action</code> and <code>method</code> attributes. This can still be done in a RESTful manner.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;p&gt;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nt">&lt;form</span> <span class="na">action=</span><span class="s">&quot;/cheeses/13579&quot;</span> <span class="na">method=</span><span class="s">&quot;POST&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;input</span> <span class="na">type=</span><span class="s">&quot;text&quot;</span> <span class="na">name=</span><span class="s">&quot;age&quot;</span> <span class="na">id=</span><span class="s">&quot;age&quot;</span> <span class="na">value=</span><span class="s">&quot;15 years&quot;</span> <span class="nt">/&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/form&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">&lt;/p&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This will cause all of the data included in the form to be placed in the request body, and submitted to the specified URL. A <em>POST</em> request tells the server that we are either adding to or changing information about a certain resource; we are changing something about our cheese.</p>

<p>This works the same way for AJAX requests as well (I am using jQuery since it is the most ubiquitous):</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;post&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">url</span><span class="o">:</span> <span class="s1">&#39;/cheeses/13579&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">data</span><span class="o">:</span> <span class="p">{</span> <span class="nx">age</span><span class="o">:</span> <span class="s1">&#39;15 years&#39;</span> <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Matching URLs to resources and actions</h3>

<p>In order to effectively form URL in the most standard and maintainable way, it&#8217;s going to help to know which URL scheme to use, and where:</p>

<p>Request from the server a list view or many resources for display:</p>

<p><code>GET http://localhost/cheeses</code></p>

<p>Request from the server a single resource for display</p>

<p><code>GET http://localhost/cheeses/13579</code></p>

<p>Request the server to create a resource:</p>

<p><code>POST http://localhost/cheeses/13579</code></p>

<p>Request the server to delete a particular resource:</p>

<p><code>DELETE http://localhost/cheeses/13579</code></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;delete&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">url</span><span class="o">:</span> <span class="s1">&#39;/cheeses/13579&#39;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>Request the server to update particular resource:</p>

<p><code>PUT http://localhost/cheeses/13579</code></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;put&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">url</span><span class="o">:</span> <span class="s1">&#39;/cheeses/13579&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">data</span><span class="o">:</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="s1">&#39;Cheddar&#39;</span><span class="p">,</span> <span class="nx">age</span><span class="o">:</span> <span class="s1">&#39;1 day&#39;</span> <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Response Codes</h3>

<p>Notice above that I specifically said &#8220;Request the server&#8221; to do something. It is important to know that while you may request something, the server does not have to comply and may decide not to perform your request. Your application must handle this gracefully by reacting to <strong>HTTP response codes</strong>.</p>

<p>You know them, but maybe you didn&#8217;t pay much attention. Every time you visit a page that&#8217;s not found, you may see a cute message about it, but the browser was returned a <em>404</em> error. That is HTTP&#8217;s way of saying that what you requested wasn&#8217;t found. If you do happen to land on the page you requested successfully, chances are your browser was sent a <em>200</em> response.</p>

<p>When working with jQuery, these codes are abstracted away from you with the <code>success</code> and <code>error</code> handlers:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">request</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;post&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">url</span><span class="o">:</span> <span class="s1">&#39;/cheeses/13579&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">data</span><span class="o">:</span> <span class="p">{</span> <span class="nx">age</span><span class="o">:</span> <span class="s1">&#39;15 years&#39;</span> <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">request</span><span class="p">.</span><span class="nx">success</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">,</span> <span class="nx">textStatus</span><span class="p">,</span> <span class="nx">jqXHR</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// take action if successful</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">request</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">jqXHR</span><span class="p">,</span> <span class="nx">textStatus</span><span class="p">,</span> <span class="nx">errorThrown</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// take action if failed</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>The success methods are generally executed if the HTTP response was successful, for example if there was a <em>200</em>, <em>302</em>, or <em>304</em> response. The error function would be called in other instances such as <em>400</em> or <em>500</em> range responses.</p>

<p>Your ability to handle these responses in a RESTful application are very important. Fortunately jQuery provides an easy way to take different courses of action for different status codes (if necessary):</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">handle200</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">,</span> <span class="nx">textStatus</span><span class="p">,</span> <span class="nx">jqXHR</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// take action if successful</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">handle404</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">jqXHR</span><span class="p">,</span> <span class="nx">textStatus</span><span class="p">,</span> <span class="nx">errorThrown</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// take action if failed</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">request</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;post&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">url</span><span class="o">:</span> <span class="s1">&#39;/cheeses/13579&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">data</span><span class="o">:</span> <span class="p">{</span> <span class="nx">age</span><span class="o">:</span> <span class="s1">&#39;15 years&#39;</span> <span class="p">},</span>
</span><span class='line'>    <span class="nx">statusCode</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>        <span class="mi">200</span><span class="o">:</span> <span class="nx">handle200</span><span class="p">,</span>
</span><span class='line'>        <span class="mi">404</span><span class="o">:</span> <span class="nx">handle404</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>With the <code>statusCode</code> object we can take different courses of action based on certain HTTP response codes. Any function can be assigned to a status code, and the arguments provided to it are based on the same criteria used to call one of the <code>success</code> or <code>error</code> methods we would have called before.</p>

<p>Some types of requests may return successful if the request was received successfully but the specific action may not have been immediately performed or is queued up for later execution as is often the case for <em>DELETE</em> requests. You may tell the server to delete a resource, and it may respond saying it was successful, only for you to find out later that nothing was actually deleted.</p>

<p>Understanding this is key: <em>requesting the server to do something is not a guarantee that you will get what you ask for</em>. That&#8217;s why it&#8217;s called a request. You cannot force the server to do something, and you should assume that it may not. The resiliency of your application will be determined on how you handle the cases where the server does not do as you ask. What may be even more difficult is handling the cases where the server may return something other than what you asked for. Having HTTP response codes will help your application handle each of these cases if you ever run across them or need that level of granularity.</p>

<h3>Overview</h3>

<p>Using REST in your code will ultimately improve the maintainability of your application, as having a simple, readable, and standard way to access and manipulate resources will assure routes stay decoupled and consistent. Remember to keep URLs descriptive of a resource, and let your verbs determine the action to take.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Keeping your JavaScript Object-Oriented]]></title>
    <link href="http://eliperelman.github.com/blog/2011/08/02/keeping-your-javascript-object-oriented/"/>
    <updated>2011-08-02T13:37:00-05:00</updated>
    <id>http://eliperelman.github.com/blog/2011/08/02/keeping-your-javascript-object-oriented</id>
    <content type="html"><![CDATA[<p>It&#8217;s commonly known that JavaScript is technically an object-oriented language, even though it doesn&#8217;t seem to follow some of the same language constructs as C# or Java and friends.</p>

<!--more-->


<p>But all too often, while I do see JavaScript written well organizationally, it is still technically written prodecurally. Take this for instance:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Car constructor function</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">Car</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">isNew</span><span class="p">,</span> <span class="nx">color</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="k">this</span> <span class="k">instanceof</span> <span class="nx">Car</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nx">Car</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">isNew</span> <span class="o">=</span> <span class="nx">isNew</span><span class="p">;</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">color</span> <span class="o">=</span> <span class="nx">color</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// later on:</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">car</span> <span class="o">=</span> <span class="nx">Car</span><span class="p">(</span><span class="kc">true</span><span class="p">,</span> <span class="s1">&#39;green&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">car</span><span class="p">.</span><span class="nx">isNew</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">getCarWash</span><span class="p">(</span><span class="nx">car</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">driveCarAround</span><span class="p">(</span><span class="nx">car</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h3>What&#8217;s the problem?</h3>

<p>Now you may be thinking, what is the problem with having code like this? The answer is maintainability. If in another part of your application you decide you need to create a car and take a similar action, you must repeat this conditional logic.</p>

<p>The problem stems partially from having easy access to the properties of this object. By having instant access to the properties of this object, your program can look at an object and decide on an action to take. From an object-oriented standpoint, this is bad, because now the object does not manage its own state and actions, but rather the application does.</p>

<h3>Is there a better solution?</h3>

<p>Of course. When crafting objects its important to provide methods so they have ability to manage their own state (properties) and actions (methods). Let&#8217;s rework our example just a tad to see how this could be simply done:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// Car constructor function</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">Car</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">isNew</span><span class="p">,</span> <span class="nx">color</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="k">this</span> <span class="k">instanceof</span> <span class="nx">Car</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">return</span> <span class="k">new</span> <span class="nx">Car</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">isNew</span> <span class="o">=</span> <span class="nx">isNew</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">color</span> <span class="o">=</span> <span class="nx">color</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Car</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">getWashed</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">isNew</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// do washing functionality</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">Car</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">driveAround</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">isNew</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="c1">// driving functionality</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// later on:</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">car</span> <span class="o">=</span> <span class="nx">Car</span><span class="p">(</span><span class="kc">true</span><span class="p">,</span> <span class="s1">&#39;green&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">car</span><span class="p">.</span><span class="nx">getWash</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">car</span><span class="p">.</span><span class="nx">driveAround</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<h3>What&#8217;s the difference?</h3>

<p>The way this example differs from our previous one has to do with who manages when things happen. In each of the snippets, the cars are checked for newness before they get washed. The improvement again lies in its maintainability. If you have other code in the future that instantiates a car, you can call <code>getWash()</code> without fear having to determine whether the car gets washed or not. The car takes care of that for you. That is the power of object-oriented programming as opposed to procedural. Let your objects determine if they need to take action, and leave the application to do other things.</p>

<p>Maintenance will be easier in the future, I promise.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Comparing against typeof 'undefined' instead of undefined]]></title>
    <link href="http://eliperelman.github.com/blog/2011/07/12/comparing-against-typeof-undefined-instead-of-undefined/"/>
    <updated>2011-07-12T10:35:00-05:00</updated>
    <id>http://eliperelman.github.com/blog/2011/07/12/comparing-against-typeof-undefined-instead-of-undefined</id>
    <content type="html"><![CDATA[<p>For the last several months I seem to be having a recurring argument over comparing variables against undefined in JavaScript. The argument usually starts over code like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">func</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="nx">val</span> <span class="o">===</span> <span class="kc">undefined</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// do something</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>




<!--more-->


<p>because I want the code to look like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">func</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">val</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">val</span> <span class="o">===</span> <span class="s1">&#39;undefined&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// do something</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>which causes an argument which goes something like this:</p>

<blockquote><p><strong>Me</strong>: Why are you comparing against <code>undefined</code>? You DO know that third party code can inadvertently change the value of <code>undefined</code>, right?</p>

<p><strong>Person</strong>: Of course, but my code is contained in a function which redefines <code>undefined</code> to <code>undefined</code>, so it&#8217;s all good?</p>

<p><strong>Me</strong>: But that won&#8217;t work in the global scope.</p>

<p><strong>Person</strong>: True, so while in the global scope, I use <code>typeof val === 'undefined'</code>.</p>

<p><strong>Me</strong>: So now your code is inconsistent.</p>

<p><strong>Person</strong>: But that&#8217;s the way the jQuery style guide says to do it&#8230;</p></blockquote>

<p>And on it goes. In almost any book which speaks of coding conventions, it states that no matter which convention you decide to use, make sure that the convention is strictly adhered to so that code is more readable and maintenance is easier.</p>

<p>But now we have an interesting situation with the creators of the most popular JavaScript framework on earth advocating two different coding styles based solely on whether your code is contained in a function or not:</p>

<blockquote><p>&#8220;Expected an identifier and instead saw &#8216;undefined&#8217; (a reserved word).&#8221; - In jQuery we re-declare &#8216;undefined&#8217; as we use it internally. Doing so prevents users from accidentally munging the name (assigning to undefined and messing up our tests) and also makes the undefined checks slightly faster.</p>

<ul>
<li>Global Variables: typeof variable === &#8220;undefined&#8221;</li>
<li>Local Variables: variable === undefined</li>
<li>Properties: object.prop === undefined</li>
</ul>
</blockquote>

<p>Source: <a href="http://docs.jquery.com/JQuery_Core_Style_Guidelines">jQuery Core Style Guidelines</a></p>

<p>Now obviously they are correct in their first method of using <code>typeof</code> to make sure a variable is undefined, because the value of <code>undefined</code> can be changed at any time by any code since in legacy browsers the <code>undefined</code> variable is just that: a variable. ECMAScript 5 compatible browsers (and hence JavaScript running in &#8220;strict mode&#8221;) forces the <code>undefined</code> variable to be &#8220;read only&#8221;, although it does this silently (without throwing an error).</p>

<p>The problem is that they adopt a different convention within their own internal code by comparing directly against <code>undefined</code> because they have created their own &#8220;internal&#8221; undefined variable:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">(</span><span class="kd">function</span><span class="p">(</span> <span class="nb">window</span><span class="p">,</span> <span class="kc">undefined</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">// jQuery source</span>
</span><span class='line'><span class="p">})(</span><span class="nb">window</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>By not passing a value to the second argument, it has effectively created its own copy of <code>undefined</code>, and can now go on their way to comparing against it directly.</p>

<p>The question arises: why have two different coding styles? They claim speed. Is that justified?</p>

<p>In running my own tests over at jsperf.com, it looks as though in some browsers comparing directly against <code>undefined</code> is a little faster but only marginally. What is interesting is that in Chrome comparing against the <code>typeof value === 'undefined'</code> test is waaaaaay faster than comparing directly <code>value === undefined</code>. If you don&#8217;t believe me head on over to jsperf.com and try it out.</p>

<p>So, since the speed difference is negligible in some browsers and in fast much slower in Chrome, is it worth maintaining two different coding conventions for a speed argument that isn&#8217;t really there? I say no. Consistency is much more important. But even the jQuery Core isn&#8217;t even perfectly consistent. Take a look at this line from the jQuery source for the <code>.data</code> method:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="k">if</span> <span class="p">(</span> <span class="k">typeof</span> <span class="nx">key</span> <span class="o">===</span> <span class="s2">&quot;undefined&quot;</span> <span class="p">)</span> <span class="p">{</span>
</span></code></pre></td></tr></table></div></figure>


<p>They are type-checking instead of a direct comparison, in direct contrast with the style guidelines.</p>

<p>So this is my point: jQuery Core, please do away with checking directly against <code>undefined</code>. It is only marginally faster in some browsers, much slower in Chrome, and makes the source inconsistent.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Frameworks vs. Micro-frameworks?]]></title>
    <link href="http://eliperelman.github.com/blog/2011/04/14/frameworks-vs-micro-frameworks/"/>
    <updated>2011-04-14T10:41:00-05:00</updated>
    <id>http://eliperelman.github.com/blog/2011/04/14/frameworks-vs-micro-frameworks</id>
    <content type="html"><![CDATA[<p>I have been thinking the past few days about two particular competing articles I read from Twitter.</p>

<!--more-->


<p>The first article was by Thomas Fuchs, Prototype.js team member and script.aculo.us creator, and it argued the perils of large, underutilized frameworks (e.g. jQuery). The <a href="http://goo.gl/RKeii">article</a> boils down to this:</p>

<blockquote><p>I for one welcome our new micro-framework overlords—small frameworks and libraries that do one thing only, not trying to solve each and every problem, just using pure JavaScript to do it. Easy to mix and match, and to customize to your needs.</p></blockquote>

<p>Now the article did make some good points, but I came away from it feeling that his assertion is that large frameworks are essentially evil.</p>

<p>The next day I read an article (<a href="http://tomdale.net/2011/04/imagine-a-beowulf-cluster-of-javascript-frameworks/">Imagine a Beowulf Cluster of JavaScript Frameworks</a>) with an opposing viewpoint by Tom Dale, a SproutCore team member (SproutCore is a large library), which argues that Thomas Fuchs&#8217; ideas sound nice, but they aren&#8217;t practical for the reason that amassing several smaller dependencies in software as opposed to one large dependency doesn&#8217;t really solve anything, and in fact can introduce problems of incompatibility. It recommended that larger frameworks should be used instead of several smaller ones.</p>

<p>So who is right?</p>

<p>I decided to broach the subject with my colleague, <a href="http://taylonr.com/">Nate Taylor</a>, to get his thoughts, and he made an excellent point:</p>

<blockquote><p>Neither of these positions is correct. Holding to one viewpoint may not be the correct choice in every situation.</p></blockquote>

<p>That&#8217;s right, neither viewpoint should be constantly adhered to. In good software engineering, it&#8217;s important to always evaluate the tools needed to do the job well and efficiently. If you are writing a large scale application, chances are you are going to need a more fully-featured JavaScript application stack to get the job done, whereas a small mom-and-pop website may only benefit from a few helping libraries.</p>

<p>So come away from these two articles with this: there&#8217;s no need to demonize large OR small frameworks, don&#8217;t pit them against each other. Rather, carefully evaluate what tools are best suited to solve your problem for the current situation and I guarantee that the decision you come to will be the correct one, whether it&#8217;s a large framework or several micro-frameworks.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Create a Deferred Wrapper around jQuery Ajax]]></title>
    <link href="http://eliperelman.github.com/blog/2011/02/22/create-a-deferred-wrapper-around-jquery-ajax/"/>
    <updated>2011-02-22T13:59:00-06:00</updated>
    <id>http://eliperelman.github.com/blog/2011/02/22/create-a-deferred-wrapper-around-jquery-ajax</id>
    <content type="html"><![CDATA[<p>In the applications I help build, jQuery is a large part of our custom framework that makes it all possible. In our framework, we always had a wrapper around jQuery&#8217;s $.ajax so we could have our own success and failure logic, and to abstract away some of the lower level code from developers that didn&#8217;t really need to know about the implementation.</p>

<p>Now, when jQuery 1.5 came out with the changes to ajax that included the Deferred syntax, it soon became apparent that our current implementation of the ajax wrapper was no longer suitable. With deferred methods available from anywhere, we could no longer control the data that became the arguments of those methods.</p>

<!--more-->


<p>Today, I&#8217;ll go over how I solved this problem, by creating a new wrapper around jQuery&#8217;s <code>$.ajax</code>with the new <code>$.Deferred</code>. I&#8217;ll keep this generic enough for you to be able to use for your own purposes.</p>

<p>First, let&#8217;s start with our application&#8217;s ajax module: <code>Application.ajax</code>. I want to be able to pass it an object of options just like jQuery&#8217;s ajax:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">Application</span><span class="p">.</span><span class="nx">ajax</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next, our ajax wrapper needs to be able to call the deferred methods just like jQuery&#8217;s ajax, so let&#8217;s create a Deferred object and return a promise.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">Application</span><span class="p">.</span><span class="nx">ajax</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">Deferred</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">d</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// implementation going here</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">promise</span> <span class="o">=</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">promise</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Even though we are returning a Deferred, we don&#8217;t have those cool <code>.success</code> and <code>.error</code> methods. We need those on our ajax too, and all they really do is just map to the <code>.done</code> and <code>.fail</code> methods of the Deferred&#8217;s promise. A little syntactic sugar is all we need; for simplicities sake we&#8217;ll add these methods directly to the promise:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">Application</span><span class="p">.</span><span class="nx">ajax</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">promise</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">Deferred</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">d</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="c1">// implementation going here</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">promise</span> <span class="o">=</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">promise</span><span class="p">.</span><span class="nx">success</span> <span class="o">=</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">done</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">promise</span><span class="p">.</span><span class="nx">error</span> <span class="o">=</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">fail</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">promise</span><span class="p">.</span><span class="nx">complete</span> <span class="o">=</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">done</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">promise</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Cool, things are starting to come together. Basically we are telling our deferred that when the success method is called, execute the same function that the Deferred uses for done. Same thing goes for error and complete.</p>

<p>Continuing on the implementation, let&#8217;s get a unified settings object so we can get ready for a request:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">Application</span><span class="p">.</span><span class="nx">ajax</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">Deferred</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">d</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">defaults</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">cache</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;post&#39;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">traditional</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">dataType</span><span class="o">:</span> <span class="s1">&#39;json&#39;</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">settings</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">({},</span> <span class="nx">defaults</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">d</span><span class="p">.</span><span class="nx">done</span><span class="p">(</span><span class="nx">settings</span><span class="p">.</span><span class="nx">success</span><span class="p">);</span>
</span><span class='line'>      <span class="nx">d</span><span class="p">.</span><span class="nx">fail</span><span class="p">(</span><span class="nx">settings</span><span class="p">.</span><span class="nx">error</span><span class="p">);</span>
</span><span class='line'>      <span class="nx">d</span><span class="p">.</span><span class="nx">done</span><span class="p">(</span><span class="nx">settings</span><span class="p">.</span><span class="nx">complete</span><span class="p">);</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">promise</span> <span class="o">=</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">promise</span><span class="p">.</span><span class="nx">success</span> <span class="o">=</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">done</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">promise</span><span class="p">.</span><span class="nx">error</span> <span class="o">=</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">fail</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">promise</span><span class="p">.</span><span class="nx">complete</span> <span class="o">=</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">done</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">promise</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>What&#8217;s going on here? First, I am creating a new settings object which is a merger between our predefined default options and the options argument, with the arguments passed in taking preference. Then we take our three ajax callbacks (success, error, and complete) and attach them using the native deferred methods, effectively attaching them to our Deferred when it resolves.</p>

<p>The code I am going to write next is a little application specific, but the process will remain the same: create new settings which get passed to the native $.ajax and override the success, error, and complete methods. Each of these methods needs to resolve the deferred in a certain manner:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">Application</span><span class="p">.</span><span class="nx">ajax</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">deferred</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">Deferred</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">d</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">defaults</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">cache</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;post&#39;</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">traditional</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>          <span class="nx">dataType</span><span class="o">:</span> <span class="s1">&#39;json&#39;</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="nx">settings</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">({},</span> <span class="nx">defaults</span><span class="p">,</span> <span class="nx">options</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="nx">d</span><span class="p">.</span><span class="nx">done</span><span class="p">(</span><span class="nx">settings</span><span class="p">.</span><span class="nx">success</span><span class="p">);</span>
</span><span class='line'>      <span class="nx">d</span><span class="p">.</span><span class="nx">fail</span><span class="p">(</span><span class="nx">settings</span><span class="p">.</span><span class="nx">error</span><span class="p">);</span>
</span><span class='line'>      <span class="nx">d</span><span class="p">.</span><span class="nx">done</span><span class="p">(</span><span class="nx">settings</span><span class="p">.</span><span class="nx">complete</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="kd">var</span> <span class="nx">jqXHRSettings</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">extend</span><span class="p">({},</span> <span class="nx">settings</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">success</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">response</span><span class="p">,</span> <span class="nx">textStatus</span><span class="p">,</span> <span class="nx">jqXHR</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>              <span class="k">if</span> <span class="p">(</span><span class="nx">settings</span><span class="p">.</span><span class="nx">dataType</span> <span class="o">===</span> <span class="s1">&#39;json&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                  <span class="k">if</span> <span class="p">(</span><span class="nx">response</span> <span class="o">&amp;&amp;</span> <span class="nx">response</span><span class="p">.</span><span class="nx">success</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                      <span class="nx">d</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">data</span><span class="p">);</span>
</span><span class='line'>                  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>                      <span class="nx">d</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">data</span><span class="p">);</span>
</span><span class='line'>                  <span class="p">}</span>
</span><span class='line'>              <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>                  <span class="nx">d</span><span class="p">.</span><span class="nx">resolve</span><span class="p">(</span><span class="nx">response</span><span class="p">);</span>
</span><span class='line'>              <span class="p">}</span>
</span><span class='line'>          <span class="p">},</span>
</span><span class='line'>          <span class="nx">error</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">jqXHR</span><span class="p">,</span> <span class="nx">textStatus</span><span class="p">,</span> <span class="nx">errorThrown</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>              <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">jqXHR</span><span class="p">);</span>
</span><span class='line'>              <span class="nx">d</span><span class="p">.</span><span class="nx">reject</span><span class="p">(</span><span class="nx">jqXHR</span><span class="p">);</span>
</span><span class='line'>          <span class="p">},</span>
</span><span class='line'>          <span class="nx">complete</span><span class="o">:</span> <span class="nx">d</span><span class="p">.</span><span class="nx">resolve</span>
</span><span class='line'>      <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">Application</span><span class="p">.</span><span class="nx">clientValidates</span><span class="p">())</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">d</span><span class="p">.</span><span class="nx">reject</span><span class="p">();</span>
</span><span class='line'>      <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>          <span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">(</span><span class="nx">jqXHRSettings</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">promise</span> <span class="o">=</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">promise</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">promise</span><span class="p">.</span><span class="nx">success</span> <span class="o">=</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">done</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">promise</span><span class="p">.</span><span class="nx">error</span> <span class="o">=</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">fail</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">promise</span><span class="p">.</span><span class="nx">complete</span> <span class="o">=</span> <span class="nx">deferred</span><span class="p">.</span><span class="nx">done</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">promise</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>Our implementation is complete. For this application, I am creating my settings for my ajax request, and overriding the status callbacks to implement my own custom logic. I also do a little client-side validation, which will not even make the ajax request, and instead, reject the deferred and call the registered error callbacks. If the request goes through, then in the success method, I am checking if the request is JSON. If so, see if the response returned from the server was successful and resolve our Deferred, thereby executing all the <code>.done</code> callbacks. If there was a failure, call the <code>.fail</code> callbacks and so on.</p>

<p>We are now free to register as many success or error callbacks as we want, just like <code>$.ajax</code>, but now we also have the power to have our own logic and data passed to those methods as our applications see fit.</p>
]]></content>
  </entry>
  
</feed>

