我对 RxJs 相当陌生,我想了解将 Rx 与 Promises 结合使用的最佳方式是什么。
我想要创建的是 Angular 中的一个服务,它充当事件调度程序模式,并在 promise 完成后发出一个事件。我还需要的是,如果没有(事件)订阅者,则 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();
现在,每当我订阅一个新的“监听器”主题时,observable 都会被拉出。任何新订阅者都将获得缓存的值,而无需再次接触服务器。
所以在我的“消费者”( Angular Directive(指令))中,我想做这样的事情:
// ... countryInput directive code:
COUNTRIES_LOADED.subscribe(function (response) {
// Fill in countries into scope or ctrl
scope.countries = response.countries;
});
COUNTRIES_LOADED 观察者的任何 future 订阅者不得触发 $http 请求。同样,如果该指令从未包含在页面中,则永远不会调用 $http。
上面的解决方案有效,但是我不知道这种方法的潜在缺点和内存影响。这是一个有效的解决方案吗?有没有更好/更合适的方法来使用 RxJs 实现这一目标?
非常感谢!
最佳答案
使用 Rx.Observable.fromPromise(promise)
来自 promise :
示例:
var source = Rx.Observable.fromPromise(promise);
var subscription = source.subscribe(
function (x) {
console.log('Next: %s', x);
},
function (err) {
console.log('Error: %s', err);
},
function () {
console.log('Completed');
});
更新
rxjs6 方法是
from
关于javascript - RxJs 从结果 Promise 创建 Observable,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38784643/