【发布时间】:2015-08-16 16:34:42
【问题描述】:
这个问题一般适用于 Promise,并不特定于 Angular,但该示例使用了 Angular $q 和服务单例。
这里是a plunker
var app = angular.module('app', []);
app.factory('onetimeResolvingService', function ($q) {
var promise = $q(function(resolve, reject) {
setTimeout(function () {
resolve();
}, 500);
});
return promise;
});
app.controller('AController', function (onetimeResolvingService, $q) {
onetimeResolvingService.then(function () {
console.log('A resolved');
return $q.reject();
}).then(function () {
console.log('A resolved');
});
});
app.controller('BController', function (onetimeResolvingService, $q) {
onetimeResolvingService.then(function () {
console.log('B resolved');
return $q.reject();
}).then(function () {
console.log('B resolved');
});
});
文件是
<body ng-app="app">
<div ng-controller="AController"></div>
<div ng-controller="BController"></div>
</body>
自然会输出
已解决
B 已解决
什么是让单例承诺只在第一次解决的好模式,即
已解决
而不是以后的时间?
onetimeResolvingService.$$state.status = 2 之类的东西可能可以解决问题,但它看起来像 $q hack 并且闻起来很糟糕。
【问题讨论】:
-
根据我的阅读,它不像你想象的那样工作。单例承诺只解决一次。然而,两个独立的 .then,一个在每个控制器中,被链接到 Promise。这两个 .thens(更准确地说是它们的回调)保证始终响应 same 结算状态 - 已解决或已拒绝。当然,这两个控制者对结算的响应方式可能完全不同,但这只是显而易见的。
-
现在可以使用 Promise.resolve() 来完成(见下文)。
标签: javascript angularjs promise angular-promise