我在这样的角度应用程序中有一个$ http承诺:
this.data = $http.get('/api/foo', {})
我的应用程序的其他部分然后将成功和错误处理程序添加到此承诺中。
我的问题是我想刷新this.data
变量中的信息,然后重新运行所有promise的附加处理程序。可以使用某种this.data.$refresh()
方法完成此操作,还是必须将所有处理程序存储在其他位置并将它们重新附加到新的$ http.get?
编辑:也许是一个更清晰的例子:
this.data = $http.get('/api/foo', {})
this.data.success(doSomething)
// doSomething() runs because the response arrives.
this.data.someMagic()
// doSomething() runs again without being reattached.
我想避免的是:
this.data = $http.get('/api/foo', {})
this.data.success(doSomething)
// Time passes...
this.data = $http.get('/api/foo', {}) // All old handlers have now been thrown away.
this.data.success(doSomething)
这是因为成功和错误都有几个处理程序,并且它们由不同的控制器和服务添加,因此每次更新变量时都需要一些凌乱的回调系统来重新连接它们的处理程序。 / p>
答案 0 :(得分:1)
重新运行所有承诺的附加处理程序。
不,那是不可能的。通过契约,promise只会解析并执行其处理程序一次。
我是否必须将所有处理程序存储在其他位置并将它们重新附加到新的$ http.get?
是的,这是一个可能的解决方案,尽管它失去了可链接等承诺的所有优点。您可以简单地放一个EventEmitter并实现某种pub-sub(例如,参见Angularjs pubsub vs $broadcast)。
如果您想拥有一个包含各种好东西的真实流界面,您可能需要查看FRP,例如使用Bacon.js和angular-bacon。