在Angular中,通过异步调用保持数据的最佳方法是什么?

时间:2015-04-16 14:10:46

标签: angularjs http asynchronous

我有一个带有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

我想我可以将索引号作为数据发送给请求并从响应中检索它,但出于某些原因,这对我来说似乎是黑客攻击。

有更好的方法吗?

3 个答案:

答案 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);
}