不确定为什么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;
}
});
答案 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>