【问题标题】:Multiple $http calls doesn't return in the right order多个 $http 调用未按正确顺序返回
【发布时间】:2015-11-25 16:00:58
【问题描述】:

我创建了一个 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;

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

【问题讨论】:

  • 这是因为您的 $http 调用是异步完成的。无论顺序如何,他们都会在通话结束时返回。
  • @RonnieTroj 我也是这么想的,但是我用谷歌搜索了如何解决这个问题,我发现我必须做出一个承诺并返回它,所以它只会在它之后返回 for 循环得到了$http 的返回。我如何使是同步的?因为这是我能找到的唯一方法。
  • 这是一种不好的做法,http 作为同步服务会造成不受欢迎的 ui 行为

标签: angularjs xmlhttprequest


【解决方案1】:

你可以创建一个promise数组,然后使用$q.all,它会在所有请求都完成后解析,并且每个请求的结果都会在你添加promise的位置。

【讨论】:

    【解决方案2】:

    $http 被设计为 ASYNC,这意味着每个 HTTP 将以相同的顺序发出,但响应取决于多种情况(网络、DNS、服务器响应时间...)

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

    You can use promise

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 我认为这不是正确的解决方案,因为我希望它是动态的。
      • 如果您希望以特定顺序响应,这是唯一的方法。如果您想在没有任何特定顺序的情况下等待所有呼叫完成,那么 Leandro 的回答就可以了。
      • 是动态的,你可以添加任意数量的,你会按顺序得到它们,但是当它们都到达时会解决,这是唯一的方法。
      • @TarunDugar 所以你是说如果我使用$q,它仍然无法工作?
      • 不,如果“工作”是指按特定顺序获得响应。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多