2015-11-08 72 views
-4

我试着迭代使用for循环的数组。在循环中有一个异步的ajax调用。我需要它使用for循环迭代的当前值,而不是在最后检索ajax调用时更改的值。我搜索了一个解决方案,并偶然发现一个函数。奇怪的是,这似乎并没有在这种情况下工作。任何人都可以帮忙?谢谢!异步javascript ajax调用关闭不起作用

编辑:
迭代的最后一个键值用于每个feed的标题。所以他提取了正确的feed(feed [key]),但是在成功部分,他只是为每个feed推送last_key + title。我没有得到任何错误,Ajax调用正常工作。

for (var key in feeds) { 
    (function(k) { 
    console.log('function: ' + k); // gives the correct keys, e.g. first time 'Reddit', second time 'Tweakers' 
    $.feedToJson({ 
     feed: feeds[k], 
     success: function(data) { 
     console.log('succes: ' + k); // always gives the last key, e.g. always 'Tweakers' 
     for (var i in data.item) { 
      var item = data.item[i]; 
      if (typeof item.title == 'object') { 
      news.push(k + ': ' + item.title[0]); 
      } else { 
      news.push(k + ': ' + item.title); 
      } 
     } 
     } 
    }); 
    })(key); 
} 

var feeds = { 
Reddit: 'https://www.reddit.com/r/leagueoflegends/.rss?sort=new', 
Tweakers:'http://www.tweakers.com/feeds/nieuws.xml' 

}

(function fetchNews() { 
    news = []; 
    for (var key in feeds) { 
     (function (k) { 
      console.log('function: ' + k); // gives the correct keys, e.g. first time 'Reddit', second time 'Tweakers' 
      $.feedToJson({ 
      feed: feeds[k], 
      success: function(data){ 
         console.log('succes: ' + k); // always gives the last key, e.g. always 'Tweakers' 
         for (var i in data.item) { 
          var item = data.item[i]; 
          if (typeof item.title == 'object') { 
           news.push(k + ': ' + item.title[0]); 
          } else { 
           news.push(k + ': ' + item.title); 
          }  
         } 
        } 
      }); 
     })(key); 
    } 

    setTimeout(function() { 
     fetchNews(); 
    }, 60000); 
})(); 

(function($) { 

$.extend({ 
    feedToJson: function(options, callback) { 
     if ($.isFunction(options)) { 
      callback = options; 
      options = null; 
     } 
     options = $.extend($.feedToJson.defaults,options); 
     var url = options.yqlURL + options.yqlQS + "'" + encodeURIComponent(options.feed) + "'" + "&_nocache=" + options.cacheBuster; 
     return $.getJSON(url, function(data){ 
       //console.log(data.query.results); 
       data = data.query.results; 
       $.isFunction(callback) && callback(data); //allows the callback function to be the only option 
       $.isFunction(options.success) && options.success(data); 
      }); 
    } 
}); 

})(jQuery的);

+1

“它似乎不工作”为什么?你看到了什么结果? – JLRishe

+0

请提供更多信息。 '在这种情况下似乎不起作用' - 你会得到什么?一个错误? 'feeds'数组和结果'news'数组中有什么?阿贾克斯调用是否正确完成? – shershen

+0

迭代的最后一个关键值用于每个Feed的标题。所以他提取了正确的feed(feed [key]),但是在成功的部分,他只是为每个feed推送last_key + title。 – Hans

回答

0

您可以使用$.each创建更简单,更具可读性的封闭。

$.each(feeds, function (key, feed) { 
    $.feedToJson({ 
     feed: feed, 
     success: function (data) { 
      console.log('succes: ' + key); // always gives the last key, e.g. always 'Tweakers' 
      $.each(data.item, function (_, item) { 
       if (typeof item.title == 'object') { 
        news.push(key + ': ' + item.title[0]); 
       } else { 
        news.push(key + ': ' + item.title); 
       } 
      }) 
     } 
    });  
}); 

基于代码显示您当前的闭合但是应该工作正常

+0

请注意,“闭环”问题的解决方案是*不*引入另一个闭包。它创造了范围。是的,这正是'$ .each'给你的:每次迭代的范围。 –