我制作了一个for
循环,在里面我对我的API进行$http
调用。
for
循环按特定顺序进行调用,但是我如何获得响应完全搞砸了..
这是我的代码:
for (var i = 0; i < amountOfEntries; i++) {
var _imageId = NieuwsService.nieuws[i].image;
if (_imageId != "") {
var uriString = "Web/Lists/getbytitle('Afbeeldingen%20voor%20nieuwsberichten')/Items(" + _imageId + ")/File";
NieuwsService.createRequest(requestUrl, baseUrl, uriString).then(function (response) {
var _parser = new DOMParser();
var _xmlData = _parser.parseFromString(response.data, "text/xml");
var _entry = _xmlData.getElementsByTagName("entry");
var _imageUrl = "http://sharepoint" + _entry[0].getElementsByTagNameNS("*", "ServerRelativeUrl")[0].childNodes[0].nodeValue;
//Display
$('#imageList').append("<li><a href='#'>" + _imageUrl + "</a></li>");
NieuwsService.images.push(_imageUrl);
})
}
}
var _createRequest = function (requestUrl, baseUrl, uriString) {
var promise = $http.get(requestUrl, {
params: {
"baseUrl": baseUrl,
"uriString": uriString
}
})
return promise;
}
NieuwsService.createRequest = _createRequest;
return NieuwsService;
所以问题是,我如何按照拨打电话的顺序得到答复?
答案 0 :(得分:2)
您可以创建承诺数组,然后使用$ q.all,它将在所有请求完成后解析,并且您将在每个请求的结果中添加承诺。
答案 1 :(得分:1)
$ http是ASYNC的设计,它意味着每个HTTP将以相同的顺序出去但响应取决于许多情况(网络,dns,服务器响应时间分机......)
您应该以考虑到这一点的方式设计您的代码。
答案 2 :(得分:1)
正如@RonnieTroj指出的那样,ajax调用是异步的,在这方面没有定义的顺序。
但是,如果您想链接api调用,以便按特定顺序获得响应,那么您唯一的选择就是以下列方式嵌套调用:
call1.then(function(data1) { //first call
call2.then(function(data2) {//second call after first call completes
//and so on
})
})
然而,这种方法的问题在于它需要更多时间,因为你本质上是在顺序进行顺序调用(一个调用执行,然后是另一个调用而不是并行异步调用。)