我是RxJs的新手,我想了解将Rx与Promises结合使用的最佳方法.
我想要创建的是Angular中的一项服务,它充当事件调度程序模式,并在承诺完成后发出事件.我还要求的是,如果没有(事件)订阅者,则observable永远不会被调用.我想要发生的最后一件事是,observable的任何后续订阅者获得相同的结果而不会触发对服务器的另一个请求.我已经设法在这里实现我自己的解决方案:
// ... CountryService code
var COUNTRIES_LOADED = Rx.Observable
.create(function (observer) {
$http
.get('/countries')
.then(function (res) {
observer.onNext(res);
}, function (err) {
observer.onError(err);
})
.finally(function () {
observer.onCompleted();
});
})
.shareReplay();
Run Code Online (Sandbox Code Playgroud)
现在,任何时候我订阅一个新的"听众"来对象观察者将被拉.任何新订阅者都将获得缓存的值,而无需再次触及服务器.
所以在我的"消费者"(Angular Directive)中,我想做这样的事情:
// ... countryInput directive code:
COUNTRIES_LOADED.subscribe(function (response) {
// Fill in countries into scope or ctrl
scope.countries = response.countries;
});
Run Code Online (Sandbox Code Playgroud)
COUNTRIES_LOADED观察者的任何未来订阅者都不得触发$ http请求.同样,如果指令从未包含在页面中,则永远不会调用$ http.
上面的解决方案有效,但我不知道这种方法的潜在缺点和内存含义.这是有效的解决方案吗?有没有更好/更合适的方法来实现这个使用RxJs?
非常感谢!
我已经开始玩RxJS5,现在看到不再有shareReplay方法了.
很可能我经常shareReplay在RxJS4中滥用,但现在我正在努力获得我想要的行为,即:
如何使用RxJS5实现此功能?
总的来说,我认为我对RxJS运算符非常了解,但对我来说,整个冷,热,发布,连接都不太清楚.有没有一个很好的参考,显示如何找到我有什么样的可观察,以便我可以以逻辑的方式找出为什么订阅没有获取值,或为什么一个observable被执行倍数?
编辑
快乐新闻,shareReplay()又回到了RxJS 5.4.0:
更新日志:https://github.com/ReactiveX/rxjs/blob/892700dd4f5d5e5f9ae9276ede32208f4390c5e9/CHANGELOG.md#540-2017-05-09
Barebones文档:http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-shareReplay