我尝试使用此循环读取一些网址以阅读其修改时间:
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
答案 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)