【问题标题】:Asynchronicity within a loop循环内的异步
【发布时间】:2011-03-19 16:34:01
【问题描述】:

我正在使用 jQuery 的 $.getJSON() API 从给定 URL 检索一组实用程序的数据。我真的很想找到一种方法来重用每个实用程序的代码(完全一样)。由于循环是在不考虑 ajax 调用的情况下执行的,所以我一直无法找到保留循环值的方法。

这个描述很烂,我知道,所以这里有一个代码 sn-p 来更好地定义它:

var utility_types = [ 'Electricity', 'Gas', 'Water' ];

/** Retrieve known utility providers for the given zip code */
for( var i = 0; i < utility_types.length; i++ ) {
  var type = utility_types[i];

  $.getJSON( '/addresses/utilities/' + zip + '/' + type + '.json', null, function( data, status ) {
    alert( 'Processing ' + type );
  });
}

我需要找到一种将类型值传递给回调的方法,以便我可以应用正确的语法。否则,所有 3 个循环都将针对“水”实用程序执行。我知道为什么它不起作用,我只是想知道是否有合理的解决方法。

谢谢。

【问题讨论】:

    标签: jquery ajax


    【解决方案1】:

    创建一个闭包

    var utility_types = [ 'Electricity', 'Gas', 'Water' ];
    
    function getCallBack(type){
       return function(data,status){
         alert( 'Processing ' + type );
       }
    }
    
    /** Retrieve known utility providers for the given zip code */
    
    for( var i = 0; i < utility_types.length; i++ ) {
      var type = utility_types[i];
    
      $.getJSON( '/addresses/utilities/' + zip + '/' + type + '.json', null, getCallBack(type));
    }
    

    【讨论】:

      【解决方案2】:

      在仍然使用匿名闭包的情况下执行此操作的规范方法是创建一个 new 匿名闭包,该闭包立即被调用并传递循环变量,然后 返回 真正的回调。

      这个匿名闭包有自己的作用域,其中包含自己的变量(包括传递的参数),这些变量可能会覆盖外部循环的变量,例如:

      ..., success: (function(type) {
          return function() {
              alert(type);
          }
      }(type))
      

      外面括号中的type 是循环变量。函数声明中的type 是一个参数,它在新闭包的范围内。当alert 被调用时,它使用范围内最接近的那个,即参数。

      当然,参数可以有自己的变量名,它不必与外部作用域中的相同!如果不同,则两者都可用,但外部范围版本将始终具有相同的值。

      【讨论】:

        【解决方案3】:

        您可以为每个 ajax 请求分配 'type' 值给成员变量,并在回调成功函数中使用 this 关键字对其进行测试:

        var utility_types = [ 'Electricity', 'Gas', 'Water' ];
        
        /** Retrieve known utility providers for the given zip code */
        for( var i = 0; i < utility_types.length; i++ ) {
          var type = utility_types[i];
        
          var jsonReq = $.getJSON( '/addresses/utilities/' + zip + '/' + type + '.json', null, function( data, status ) {
            alert( 'Processing ' + this.utilityType );
          });
          jsonReq.utilityType = type;
        }
        

        【讨论】:

          猜你喜欢
          • 2018-10-17
          • 2017-10-30
          • 1970-01-01
          • 1970-01-01
          • 2018-09-18
          • 2021-12-12
          • 2019-04-07
          • 1970-01-01
          • 2012-09-10
          相关资源
          最近更新 更多