title: Is nested XMLHttpRequests with multiple closures a good idea?
body: <p>I have a Greasemonkey script which operates on a search results page at a video site.  The function of the script is to take a javascript link that opens a new window with a flash player, jump through some redirection hoops, and insert a regular link to the desired FLV file.</p>
  
  <p>I have changed the script to do silly but structurally equivalent things to en.wikipedia.org.  My question is whether the 3 nested closures and the nested xmlhttprequests is the best way to go about this.</p>
  
  <hr>
  
  <pre><code>// ==UserScript==
  // @name                wiki mod example
  // @namespace         http://
  // @description         example script
  // @include  *wikipedia.org*
  // ==/UserScript==
  
  var candidates = document.getElementsByTagName("a");
  
  for (var cand = null, i = 0; (cand = candidates[i]); i++) {
    if (cand.href.match(/\/wiki\/W/)) { // for all articles starting with 'W'
      var progress = document.createElement('span');
      progress.appendChild(document.createTextNode(" Start"));
      cand.parentNode.insertBefore(progress, cand.nextSibling);
      progress.addEventListener("click",
      function(link1) { return function() { // link1 is cand.href
        this.innerHTML = " finding...";
  
        GM_xmlhttpRequest({method:"GET",url:link1,
          onload:function(p) { return function(responseDetails) {
            // p is is the current progress element
            // the first linked article starting with 'S' is *special*
            var link2 = responseDetails.responseText.match(/\/wiki\/S[^"]+/);
            if(!link2) { p.innerHTML = "failed in request 1"; return;}
  
            GM_xmlhttpRequest({method:"GET",url:"http://en.wikipedia.org"+link2[0],
              onload:function(p2) { return function(responseDetails) {
                // p2 is p, ie. progress
                // link3 would contain the URL to the FLV in the real script
                var link3 = responseDetails.responseHeaders.match(/Content-Length.+/);
                if(!link3) { p2.innerHTML = "failed in request 2"; return;}
  
                var elmNewContent = document.createElement('p');
                elmNewContent.appendChild(document.createTextNode(link3));
                p2.parentNode.insertBefore(elmNewContent, p2.nextSibling);
                p2.innerHTML = " &lt;em&gt;Done&lt;/em&gt;";
              }}(p) // 3rd closure
            }); // end of second xmlhttprequest
  
          }}(this) // 2nd closure
        }); // end of first xmlhttprequest
  
      }}(cand.href), true); // 1st closure and end of addeventlistener
    } 
  }
  </code></pre>