我对 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/

10-13 08:59