2013-10-07 57 views
2

我在使用$ q的AngularJS时创建单个承诺并且承诺已经解决,是否可以再次解决?我不知道这是否可能,但如果没有的话,我是否可以一次又一次解决同样的承诺。我正在考虑使用通知方式,但我不知道是否有其他方法来执行此操作。再次解决已解决的承诺

+1

要“再次解决承诺”没有任何意义。例如,您最终可以重新发送相同的请求,但这完全不同。你想要做什么? – Blackhole

+0

Richeve,这取决于你正在尝试做什么。正如其他人已经正确指出的那样,解决(或拒绝)的承诺不能改变状态。但是,您希望重新访问解决(或拒绝)承诺的值,这完全是另一回事,例如'myPromise.done(myfunc1); .... myPromise.done(myfunc2)' –

回答

4

Mastering Web Application Development with Angularjs, by Kozlowski and Bacon,第3章,节“与$ Q无极API”“与后端服务器通信”:

这是解决或拒绝一次,不能改变其状态的承诺。

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

  • 解决拒绝承诺
  • 解决已经解决的承诺有不同的结果
  • 拒绝一个解决承诺
  • 拒绝被拒绝的承诺有不同拒绝原因

这些规则很直观。 例如,如果我们可以用比萨饼成功送达(可能已被吃掉!)之后比萨饼订单发货存在问题的信息回叫,那就没什么意义了。

如果您提供了更多的代码,并且我们可以更好地理解您正在尝试执行的操作,我们可能会帮助您。

+0

如果您需要来自承诺的多个值,承诺可能不是您所需要的。您可能会考虑使用Rx.js或Irakli“Gozala”的redurs等功能反应编程https://github.com/Gozala/reducers –

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(); 

重新初始化它,我不知道这是最好的解决方案,但它似乎工作。