$q.all 仅适用于第一次调用

$q.all works for the first call only

不确定为什么 q.all 第二次不起作用,例如第二次它不等待所有的承诺被解决。

请查看示例并按 "call services" 按钮。第一次它会等到两个 promise 都已解决,但如果您再次按下按钮,它会立即响应,不知道为什么?

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;
  }
});

一个承诺只能解决一次。您的服务始终returns不变的承诺。解决了就解决了

顺便说一句,您正在使用反模式。 $timeout 已经 returns 一个承诺。您在服务中应该拥有的只是

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

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

服务 2 相同,顺便说一句。但是由于这两个服务完全相同(除了超时持续时间),并且不做任何 $timeout 没有做的事情,你可以直接从你的控制器使用 $timeout。