多个 $http 调用的顺序 return 不正确
Multiple $http calls doesn't return in the right order
我创建了一个 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;
所以问题是,如何按调用顺序获得响应?
您可以创建承诺数组,然后使用 $q.all 它将在所有请求完成后解析,并且您将在添加承诺的相同位置获得每个请求的结果。
$http 在设计上是异步的,这意味着每个 HTTP 将以相同的顺序发出,但响应取决于多种情况(网络、dns、服务器响应时间延长...)
您设计代码时应考虑到这一点。
正如@RonnieTroj 所指出的,ajax 调用是异步的,在这方面没有明确的顺序。
但是,如果您想要链接 api 调用,以便您按特定顺序获得响应,那么您唯一的选择是按以下方式嵌套调用:
call1.then(function(data1) { //first call
call2.then(function(data2) {//second call after first call completes
//and so on
})
})
但是,此方法的问题在于它会花费更多时间,因为您本质上是按顺序进行调用(先执行一个调用,然后执行另一个调用,而不是并行异步调用。)
我创建了一个 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;
所以问题是,如何按调用顺序获得响应?
您可以创建承诺数组,然后使用 $q.all 它将在所有请求完成后解析,并且您将在添加承诺的相同位置获得每个请求的结果。
$http 在设计上是异步的,这意味着每个 HTTP 将以相同的顺序发出,但响应取决于多种情况(网络、dns、服务器响应时间延长...)
您设计代码时应考虑到这一点。
正如@RonnieTroj 所指出的,ajax 调用是异步的,在这方面没有明确的顺序。
但是,如果您想要链接 api 调用,以便您按特定顺序获得响应,那么您唯一的选择是按以下方式嵌套调用:
call1.then(function(data1) { //first call
call2.then(function(data2) {//second call after first call completes
//and so on
})
})
但是,此方法的问题在于它会花费更多时间,因为您本质上是按顺序进行调用(先执行一个调用,然后执行另一个调用,而不是并行异步调用。)