循环中的jQuery.ajax()[复制]

前端之家收集整理的这篇文章主要介绍了循环中的jQuery.ajax()[复制]前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > JavaScript closure inside loops – simple practical example37个
如果我在循环中调用jQuery.ajax(),它会导致当前迭代中的调用覆盖最后一次调用还是为新请求分配了新的XHR对象?

我有一个循环来执行此操作,而从控制台日志我可以看到请求完成200 ok但是循环中最后一个请求的结果数据由请求成功回调存储为假设.

代码

var Ajax = {
    pages: {},current_request: null,prefetch: function () {
        currentPath = location.pathname.substr(1);

        if(this.pages[currentPath])
        {
            var current = this.pages[currentPath];
            delete this.pages[currentPath];

            current['name']=currentPath;
            current['title']=$("title").text().replace(' - '.SITE_NAME,'');
            current['Meta_description']=$("Meta[name=description]").attr('content');
            current['Meta_keywords']=$("Meta[name=keywords]").attr('content');          
        }

        var _Ajax = this;
        //the loop in question *****
        for(var key in this.pages)
        {
            $.ajax({
                method: 'get',url:'http://'+location.hostname+'/'+key,success: function(data) {
                    _Ajax.pages[key] = data;    
                }
            }); 

                    console.debug(this.pages);
        }

        if(current)
        {
            this.pages[currentPath] = current;
        }       

    } 
};//Ajax Obj
for(var i in pages)
{
    Ajax.pages[pages[i]]={};
}

$(function() {
    Ajax.prefetch();
});//doc ready

解决方法

你需要一个关键的闭包:
for(var k in this.pages){
    (function(key){
            $.ajax({
                method: 'get',success: function(data) {
                    _Ajax.pages[key] = data;    
                }
            }); 

            console.debug(this.pages);
    })(k);
}

这样你可以确保每个ajax成功回调中的键始终是正确的.
但除此之外,它应该工作

我使用超时代替ajax做了一个小闭包演示,但原理是一样的:

http://jsfiddle.net/KS6q5/

原文链接:https://www.f2er.com/jquery/181109.html

猜你在找的jQuery相关文章