$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。
不确定为什么 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。