$ q.all仅适用于第一个电话

时间:2017-06-03 12:32:51

标签: angularjs q

不确定为什么q.all第二次没有工作,例如第二次它不等待所有的承诺得到解决。

请查看示例并按“呼叫服务”按钮。第一次等到两个承诺都被解决但如果你再次按下按钮它会立即响应,不知道为什么?

http://plnkr.co/edit/JNJmX1fjsmxrxYuiNHJb?p=preview

 var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope, $q, MyService1, MyService2) {
  $scope.name = 'World';

  $scope.Status1 = 'Waiting';
  $scope.Status2 = 'Waiting';
  $scope.buttonValue = "Call Services";

  $scope.doServices = function() {

    $scope.Status1 = 'Waiting';
    $scope.Status2 = 'Waiting';
    $scope.buttonValue = "Working ...";
    console.log($scope.Status1)

    var promise1 = MyService1.doIt();
    var promise2 = MyService2.doIt();

   $q.all([promise1, promise2]).then(
      function() {
        $scope.Status1 = 'Done';
      },
      function() {
        $scope.Status1 = 'Failed';
      }
    ).finally(function() {
      $scope.Status2 = 'Done waiting';
      $scope.buttonValue = "Call Services";
      //promises = null;
    });

  }

  $scope.callServices = function() {
     $scope.Status1 = 'Waiting';
  $scope.Status2 = 'Waiting';
    $scope.doServices();
  }

  $scope.reset = function() {
    $scope.Status1 = 'Waiting';
    $scope.Status2 = 'Waiting';
  }

});

app.service("MyService1", function($q, $timeout) {

  var deferred = $q.defer();

  this.doIt = function() {
    $timeout(function() {
      console.log("Service 1 called!");
      deferred.resolve("Service 1 done!");
    }, 2000);

    return deferred.promise;
  }
});


app.service("MyService2", function($q, $timeout) {

  var deferred = $q.defer();

  this.doIt = function() {
    $timeout(function() {
      console.log("Service 2 called!");
      deferred.resolve("Service 2 done!");
    }, 5000)

    return deferred.promise;
  }
});

1 个答案:

答案 0 :(得分:2)

承诺只能解决一次。您的服务始终会返回相同的承诺。一旦解决,它就会得到解决。

你正在使用反模式BTW。 $ timeout已经返回一个promise。您在服务中应该拥有的只是

app.service("MyService1", function($timeout) {

  this.doIt = function() {
    return $timeout(function() {
      console.log("Service 1 called!");
      return "Service 1 done!";
    }, 2000);
  }
});

服务2,BTW相同。但由于两个服务都完全相同(除了超时的持续时间),并且不执行$ timeout已经做过的任何事情,你可以直接从你的控制器使用$ timeout。 / p>