ThomasReggi
ThomasReggi

Reputation: 59365

Passing loop count into ajax success anon function

In the example below key is equal to the length of d1.periods everytime. Is their a better way besides passing key into data as a post variable, to get key into successes anonymous function?

$.ajax({
  url: 'api/dates.json',
  dataType: 'json',
  success: function(d1){
    $('#scan-interactive').removeClass('disabled');
    for(var key in d1.periods){

      var html = "";
      html += '<tr id="'+d1.periods[key].id+'">';
      html += '<td class="month">'+d1.periods[key].month+'</td>';
      html += '<td class="week">'+d1.periods[key].week+'</td>';
      html += '<td class="days">'+d1.periods[key].days+'</td>';
      html += '<td class="dates">'+d1.periods[key].dates+'</td>';
      html += '<td class="open"></td>';
      html += '<td class="refunded"></td>';
      html += '<td class="closed"></td>';
      html += "</tr>";
      $('#scan-interactive table tbody').append(html);

      $.ajax({
        type: 'POST',
        url: 'api/count.json',
        dataType: 'json',
        data:{'created_at_min':d1.periods[key].created_at_min,'created_at_max':d1.periods[key].created_at_max},
        success: function(d2){
          $('#'+d1.periods[key].id+" .open").html(d2.open);
          $('#'+d1.periods[key].id+" .closed").html(d2.closed);
          $('#'+d1.periods[key].id+" .returns").html(d2.returns);                  
        }
      });

    }
  }
});

Upvotes: 1

Views: 1334

Answers (2)

Kevin B
Kevin B

Reputation: 95022

Pass the key as an option to the ajax request, then access it with this.nameofoption.

for (var i = 0; i < 5; i++) {
    $.ajax({
        url: "/echo/html",
        method: "post",
        data: {
            html: "foo",
            delay: 1
        },
        context: {key: i},
        success: function(){
            console.log(this.key);
        }
    });
}

Demo: http://jsfiddle.net/R9Ldd/2/

Updated to use firebuglite

Upvotes: 2

Guffa
Guffa

Reputation: 700362

Wrap it in a closure:

(function(key){

  $.ajax({
    type: 'POST',
    url: 'api/count.json',
    dataType: 'json',
    data:{'created_at_min':d1.periods[key].created_at_min,'created_at_max':d1.periods[key].created_at_max},
    success: function(d2){
      $('#'+d1.periods[key].id+" .open").html(d2.open);
      $('#'+d1.periods[key].id+" .closed").html(d2.closed);
      $('#'+d1.periods[key].id+" .returns").html(d2.returns);                  
    }
  });

})(key);

Upvotes: 4

Related Questions