多个$ http调用不按正确的顺序返回

时间:2015-11-25 07:45:42

标签: angularjs xmlhttprequest

我制作了一个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;

所以问题是,我如何按照拨打电话的顺序得到答复?

3 个答案:

答案 0 :(得分:2)

您可以创建承诺数组,然后使用$ q.all,它将在所有请求完成后解析,并且您将在每个请求的结果中添加承诺。

答案 1 :(得分:1)

$ http是ASYNC的设计,它意味着每个HTTP将以相同的顺序出去但响应取决于许多情况(网络,dns,服务器响应时间分机......)

您应该以考虑到这一点的方式设计您的代码。

You can use promise

答案 2 :(得分:1)

正如@RonnieTroj指出的那样,ajax调用是异步的,在这方面没有定义的顺序。

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

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

然而,这种方法的问题在于它需要更多时间,因为你本质上是在顺序进行顺序调用(一个调用执行,然后是另一个调用而不是并行异步调用。)