Javascript 将循环计数传递给ajax success anon函数

Javascript 将循环计数传递给ajax success anon函数,javascript,jquery,ajax,Javascript,Jquery,Ajax,在下面的示例中,每次key等于d1.periods的长度。除了将key作为post变量传递到数据中之外,将key传递到匿名函数中是更好的方法吗 $.ajax({ url: 'api/dates.json', dataType: 'json', success: function(d1){ $('#scan-interactive').removeClass('disabled'); for(var key in d1.periods){ var html

在下面的示例中,每次key等于d1.periods的长度。除了将key作为post变量传递到数据中之外,将key传递到匿名函数中是更好的方法吗

$.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);                  
        }
      });

    }
  }
});

将密钥作为选项传递给ajax请求,然后使用this.nameof选项访问它

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);
        }
    });
}
演示:


更新为使用firebuglite

将密钥作为选项传递给ajax请求,然后使用此.nameof选项访问它

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);
        }
    });
}
演示:

更新为使用firebuglite

将其包裹在封口中:

(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);
把它包起来:

(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);

太棒了,我从来都不记得使用闭包。键不是已经可以访问了吗?因为您已经在定义键的外部ajax成功调用的闭包范围内了吗?@Zero21xxx:是的,它是可以访问的,但它会更改。调用回调方法时,循环已经结束,所有回调都将使用最后一个键。闭包为每个回调创建一个本地副本。@Guffa感谢您的澄清。盯着它看了一会儿,我想到了这一点。@Guffa精彩绝伦,解释!太棒了,我从来都不记得使用闭包。键不是已经可以访问了吗?因为您已经在定义键的外部ajax成功调用的闭包范围内了吗?@Zero21xxx:是的,它是可以访问的,但它会更改。调用回调方法时,循环已经结束,所有回调都将使用最后一个键。闭包为每个回调创建一个本地副本。@Guffa感谢您的澄清。盯着它看了一会儿,我想到了这一点。@Guffa精彩绝伦,解释+1相互测试选项。但是,您必须谨慎,以免使用ajax方法使用的属性名称。对于每个版本,列表似乎都在增长,因此您可能应该使用一个您确信永远不会使用的属性名称。@Guffa-我喜欢此选项而不是附加闭包的唯一原因是这样做所需的代码更少。我看到这个选项的最大问题是它没有文档记录,这很容易与父范围的this to新手开发者混淆。正如您所提到的,使用一个ajax以后不会使用的名称,例如loopkey或periodkey,这是非常重要的。上下文选项的文档说明默认值是options对象,但没有这样使用的示例。当然,另一种方法是将键分配给上下文选项本身,然后它在回调中可用。因此,我想更好的方法是将对象传递给包含值的上下文。+1 Interresting选项。但是,您必须谨慎,以免使用ajax方法使用的属性名称。对于每个版本,列表似乎都在增长,因此您可能应该使用一个您确信永远不会使用的属性名称。@Guffa-我喜欢此选项而不是附加闭包的唯一原因是这样做所需的代码更少。我看到这个选项的最大问题是它没有文档记录,这很容易与父范围的this to新手开发者混淆。正如您所提到的,使用一个ajax以后不会使用的名称,例如loopkey或periodkey,这是非常重要的。上下文选项的文档说明默认值是options对象,但没有这样使用的示例。当然,另一种方法是将键分配给上下文选项本身,然后在回调中可以使用它,因此我想更好的方法是将一个对象传递给包含该值的上下文。