我正在使用$ q的AngularJS,当我创建一个承诺并且该承诺已经解决时,是否可以再次解决?我不知道这是否可能,但如果没有,我可以一次又一次地解决同样的承诺。我正在考虑使用通知方式,但我不知道是否还有其他方法可以做到这一点。
答案 0 :(得分:4)
从Mastering Web Application Development with Angularjs, by Kozlowski and Bacon,第3章“与后端服务器通信”,“带有$ q的Promise API”部分:
一旦解决或拒绝的承诺无法改变其状态。
只有一次机会提供承诺的结果。换句话说,不可能:
- 解决被拒绝的承诺
- 使用不同的结果解析已解决的承诺
- 拒绝已解决的承诺
- 拒绝具有不同拒绝原因的被拒绝承诺
这些规则相当直观。 例如,如果我们可以在披萨成功交付(并且可能已经吃掉!)后披露订单交付存在问题的信息被召回,那就没有多大意义了。
如果您提供更多代码,我们可以更好地了解您的目标,我们可以为您提供帮助。
答案 1 :(得分:0)
我所做的只是再次重新初始化承诺:
var appReadyDeferred = $q.defer();
this.prepareAppReadyDeffered = function() {
appReadyDeferred = $q.defer();
};
this.appReady = function() {
return appReadyDeferred.promise;
};
this.appResolve = function() {
appReadyDeferred.resolve();
};
this.appDeferr = function() {
appReadyDeferred.reject();
};
所以我可以使用
someService.appReady().then(function() {
// some code
});
使用
重新启动它someService.prepareAppReadyDeffered();
我不确定这是最好的解决方案,但似乎有效。