【问题标题】:Asynchronous javascript ajax call closure not working [duplicate]异步javascript ajax调用关闭不起作用[重复]
【发布时间】:2015-11-08 16:08:08
【问题描述】:

我尝试使用 for 循环遍历数组。在循环中有一个异步的ajax调用。我需要它使用 for 循环迭代的当前值,而不是最终检索 ajax 调用时更改的值。我搜索了一个解决方案,并偶然发现了一个函数的闭包。奇怪的是,在这种情况下它似乎不起作用。有谁能帮忙吗?谢谢!

编辑:
迭代的最后一个键值用于每个提要的标题。因此,他获取了正确的提要(提要 [key]),但在成功部分,他只是为每个提要推送 last_key + 标题。我没有收到任何错误,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);

【问题讨论】:

  • “它似乎不起作用” 为什么?你看到了什么结果?
  • 请提供更多信息。 '在这种情况下它似乎不起作用' - 你得到了什么?一个错误? 'feeds' 数组和生成的 'news' 数组中有什么? ajax 调用是否正确完成?
  • 在函数内部和外部都有一个单独的键变量非常令人困惑。尝试将函数内部的一个更改为 k。我不希望这会产生影响,但至少这样您将 100% 确定您使用的是正确的变量。
  • 您发布的代码不会导致您观察到的行为。您的实际应用程序中的某些内容必须有所不同。
  • 您对所发生情况的报告与您向我们展示的代码实际工作方式不符。因此,我怀疑您对问题的分析有问题,或者您没有向我们展示足够多的真实代码,并且您运行的实际代码与您向我们展示的代码有所不同。

标签: javascript jquery ajax


【解决方案1】:

您可以使用$.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);
                }
            })
        }
    });    
});

根据显示的代码,您当前的关闭应该可以正常工作

【讨论】:

  • 请注意,“闭环”问题的解决方案是引入另一个闭包。它正在创造范围。是的,这正是$.each 为您提供的:每次迭代的范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 2013-11-05
相关资源
最近更新 更多