我有一个带有for循环的控制器,它会对一组URL进行HEAD请求,以检查文件是否存在。当我从HEAD请求获得响应时,我需要请求所基于的数组中的索引号。
var allFiles = [], files = [];
allFiles.push({"url":"http://www.example.com/foo","source":"source1"});
allFiles.push({"url":"http://www.example.com/bar","source":"home"});
allFiles.push({"url":"http://www.example.com/wtf","source":"outer space"});
for(var i=0,len=allFiles.length;i<len;i++) {
$http.head(allFiles[i].url).then(function(response) {
files.push(allFiles[VALUE_OF_i_AT_TIME_OF_REQUEST]);
}
}
修改:
因为它是异步调用,所以我不能使用i代替VALUE_OF_i_AT_TIME_OF_REQUEST。这样做会导致我总是等于len-1
我想我可以将索引号作为数据发送给请求并从响应中检索它,但出于某些原因,这对我来说似乎是黑客攻击。
有更好的方法吗?
答案 0 :(得分:1)
您可以使用函数闭包
来完成此操作for (var i = 0, len = allFiles.length; i < len; i++) {
function sendRequest(index) {
$http.head(allFiles[index].url).then(function (response) {
files.push(allFiles[index]);
});
}
sendRequest(i);
}
答案 1 :(得分:0)
我可能过于简单了(异步代码对我来说仍然很棘手),但是你可以在每个循环上将i
设置为新的局部变量j
,然后引用j
而不是{ {1}}中的{1}}:
i
答案 2 :(得分:0)
我做了类似于@ rob的建议,似乎正在做这个伎俩。
var allFiles = [], files = [];
allFiles.push({"url":"http://www.example.com/foo","source":"source1"});
allFiles.push({"url":"http://www.example.com/bar","source":"home"});
allFiles.push({"url":"http://www.example.com/wtf","source":"outer space"});
for(var i=0,len=allFiles.length;i<len;i++) {
(function(i) {
$http.head(allFiles[i].url).then(function(response) {
files.push(allFiles[i]);
}
})(i);
}