将变量传递给ajax调用内的函数

时间:2014-07-31 20:25:25

标签: javascript jquery ajax

我尝试使用此循环读取一些网址以阅读其修改时间:

var arr = [];

//... fill arr with push

for (var e in arr) {
        nodename=arr[e].hostname;
        node_json="/nodes/"+nodename;
        html +='<a href="'+node_json+'" target="_blank" id="host_'+nodename+'">data</a>';

        xhr = $.ajax({
            url: node_json,
            success: (function(nn) {
                $('#host_'+nn).append("last modified: " + xhr.getResponseHeader("Last-Modified"));
            })(nodename)
        });

这已经有点了,我注释了success行:我接到所有节点文件的调用,在Firebug中,我可以在调用的标题中看到不同的修改时间。

起初我有一个闭包,(见How to generate event handlers with loop in Javascript?)而且我只修改了所有结果的最后一行。这就是我尝试将动作放在一个单独的函数中的原因。

但是这给了:

  

ReferenceError:xhr未定义
  $(&#39; #host _&#39; + nn).append(&#34;最后修改:&#34; + xhr.getResponseHeader(&#34; Last-Modified&#34;)...

如何将xhr纳入该功能?


我也试过了:

...
        xhr[e] = $.ajax({
            url: node_json,
            success: add_result_to_info(nodename, e)
        });

    }
}
// outside loop
function add_result_to_info(nn, e) {
    $('#host_'+nn).append("last modified: " + xhr[e].getResponseHeader("Last-Modified"));
}

AJAX电话来源:Get the modified timestamp of a file with javascript

2 个答案:

答案 0 :(得分:2)

如果arr确实是一个数组,只需使用.forEach或甚至更好.map(在旧浏览器上使用垫片)来封装每个迭代的范围,而无需额外的闭包:< / p>

var xhrs = arr.map(function(e) {
    var nodename = e.hostname;
    var node_json = "/nodes/" + nodename;

    html +='<a href="'+node_json+'" target="_blank" id="host_'+nodename+'">data</a>';

    return $.ajax({
        url: node_json
    }).done(function(data, status, xhr) {
        $('#host_'+nodename).append("last modified: " + xhr.getResponseHeader("Last-Modified"));
    });
});

使用var xhrs = arr.map()代替.forEach的原因是,您(免费)可以在每个AJAX请求完成后调用另一个回调:

$.when.apply($, xhrs).then(function() {
     // woot!  They all finished
     ...
});

答案 1 :(得分:1)

您正在直接执行该方法并将其结果作为success回调的回调传递。

xhr已作为第3个参数传递,请尝试

success: function(nn,status, xhr) {
            $('#host_'+nn).append("last modified: " + xhr.getResponseHeader("Last-Modified"));
        }

如果你还必须传递nodename,你需要使用一个返回函数的函数

success: (function(nn){
              return function(data ,status, xhr) {
                 // you can use nodename here...
                 $('#host_'+nn).append("last modified: " + xhr.getResponseHeader("Last-Modified"));
            };
        })(nodename)