1

这就是交易。

我在进行 $http 调用时显示微调器的内容,但这里的问题是我有多个调用,所以我在这里找到的示例没有帮助。

有人对此有解决方案吗?

一种堆叠调用的方法,以便微调器保持到最后一次调用完成?我希望能说明我的观点。

我在做这个。

angular.module('moduleName', []).
factory.("SomeService", function () {
    return:{
        getResources(params) {
        /* do the $http call */
        }
    }
}).
controller("SomeCtrl", function (SomeService) {
    SomeService.getResources(params)
}).
controller("OtherCtrl", function (SomeService) {
    SomeService.getResources(params)
});

2 个控制器可能同时调用服务,可能会得到不同的响应。

4

3 回答 3

6

$httpAngular 中的所有调用都会返回一个 Promise。

$q服务没有它所基于的Q库的所有花里胡哨,但是如果您查看文档,它确实有一种all方法可以用来为您提供所需的功能。

以下是您可以使用它的方法:

app.controller('HttpController', function($http, $q) {

  // A hypothetical submit function
  $scope.submit = function() {
    // Set a loading variable for use in the view (to show the spinner)
    $scope.loading = true;

    var call1 = $http.get(/* ... */);
    var call2 = $http.get(/* ... */);
    var call3 = $http.get(/* ... */);

    $q.all([call1, call2, call3]).then(function(responses) {
      // responses will be an array of values the individual
      // promises were resolved to. For this case, we don't 
      // need it, since we only care that they all resolved
      // successfully.

      $scope.loading = false;
    }, function(errorValue) {
      // If any of the promises is rejected, the error callback 
      // will be resolved with that rejection value, kind of like
      // an early exit. We want to mark the loading variable
      // as false here too, and do something with the error.

      $scope.loading = false;
    });
  };
});
于 2013-05-27T19:03:51.780 回答
0

使用初始化为您正在进行的调用次数的变量。在 AJAX 调用的每个回调中,调用一个递减此变量值的函数,如果它为零,则删除微调器。

num_calls = 3;

function considerRemoveSpinner() {
    if (--window.num_calls == 0)
    {
        removeSpinner();
    }

} 

$http.get("url").success(
    function() {
        /* regular handler */
        considerRemoveSpinner();
   }
);

/* other ajax calls */
于 2013-05-27T17:46:35.507 回答
0

您可以通过使用拦截器并在每个 API 的标头中传递一个标志来做到这一点。您需要做什么。在每个 $http 调用中添加一个参数。

然后使用属性config.headers.{{Parameter}}在拦截器请求方法中捕获它。基于此标志广播一个显示等待图像的事件。

于 2015-08-06T13:32:06.770 回答