多个 $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、服务器响应时间延长...)

您设计代码时应考虑到这一点。

You can use promise

正如@RonnieTroj 所指出的,ajax 调用是异步的,在这方面没有明确的顺序。

但是,如果您想要链接 api 调用,以便您按特定顺序获得响应,那么您唯一的选择是按以下方式嵌套调用:

call1.then(function(data1) { //first call
    call2.then(function(data2) {//second call after first call completes    
     //and so on
    }) 
})

但是,此方法的问题在于它会花费更多时间,因为您本质上是按顺序进行调用(先执行一个调用,然后执行另一个调用,而不是并行异步调用。)