2

我正在使用 $q 的 AngularJS,当我创建一个承诺并且该承诺已经解决时,它可以再次解决吗?我不知道这是否可行,但如果不是,有没有办法可以一次又一次地解决相同的承诺。我正在考虑使用通知方式,但我不知道是否有其他方法可以做到这一点。

4

2 回答 2

4

来自Kozlowski 和 Bacon 的Mastering Web Application Development with Angularjs ,第 3 章“与后端服务器通信”,“使用 $q 的 Promise API”部分:

曾经被解决或拒绝的承诺不能改变它的状态。

提供承诺结果的机会只有一次。换句话说不可能:

  • 解决被拒绝的承诺
  • 用不同的结果解决已经解决的承诺
  • 拒绝已解决的承诺
  • 以不同的拒绝原因拒绝被拒绝的承诺

这些规则相当直观。例如,如果我们可以在披萨成功交付(并且可能被吃掉!)之后被回电并告知披萨订单交付存在问题的信息,那将没有多大意义。

如果您提供更多代码并且我们可以更好地理解您正在尝试做什么,我们可能会为您提供帮助。

于 2013-10-07T15:12:11.913 回答
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();

我不确定这是最好的解决方案,但它似乎有效。

于 2013-10-09T09:19:05.220 回答