javascript - RxJs 从结果 Promise 创建 Observable

标签 javascript angularjs rxjs

我是 RxJs 的新手,我想了解将 Rx 与 Promises 结合使用的最佳方式是什么。

我想要创建的是 Angular 中的一个服务,它充当事件调度程序模式,并在 promise 完成后发出一个事件。我还需要的是,如果没有(事件)订阅者,则永远不会调用可观察对象。我最不想发生的事情是,可观察对象的任何后续订阅者都会获得相同的结果,而不会触发对服务器的另一个请求。 我在这里设法实现了自己的解决方案:

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

现在任何时候我订阅一个新的“监听器”来接受可观察对象。任何新订阅者都将获得缓存的值,而无需再次接触服务器。

所以在我的“消费者”( 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 :

Converts a Promises/A+ spec compliant Promise and/or ES2015 compliant Promise or a factory function which returns said Promise to an Observable sequence.

示例:

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/

相关文章:

javascript - 将文本添加到 onKeyPress react.js 的文本输入中

javascript - 使用 jquery 捕获跨度值

javascript - 检查删除和更新 ui angular ngResource 模块

javascript - 仅当函数运行 10 次后才继续下一步

angular - 我可以自定义 Angular 全局错误处理程序,使其不仅仅是一个错误参数吗?

angular - 我需要 `complete()` takeUntil ngOnDestroy 内的主题吗?

javascript - 我的播放器和二维数组中的 block 之间的碰撞检测

javascript - 如何使用方括号保存 JSON 编码内容的数组?

javascript - 在没有ajax的情况下在angularjs和express/node之间传递数据

css - 将 angularjs 自定义类指令绑定(bind)到 SVG 元素