当前位置: 首页 > 知识库问答 >
问题:

RxJs从产生的promise中创建可观察的

桓风史
2023-03-14

我对RxJs还比较陌生,我想了解与Rx结合使用Promises的最佳方式是什么。

我想要创建的是Angular中的一个服务,它的作用类似于事件分派器模式,一旦promise完成,就会发出一个事件。我还需要的是,如果没有(事件)订阅者,则永远不会调用可观察对象。我最不希望发生的事情是,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();

现在,每当我订阅一个新的“监听器”主题时,可观察的对象就会被拉出来。任何新订阅者都将获得缓存的值,而无需再次接触服务器。

所以在我的“消费者”(角度指令)中,我想做如下事情:

// ... countryInput directive code:

COUNTRIES_LOADED.subscribe(function (response) {
    // Fill in countries into scope or ctrl
    scope.countries = response.countries;
});

任何未来的国家/地区/地区/地区/地区/地区/地区/地区/地区/地区/地区的订阅方不得触发$http请求。同样,如果该指令从未包含在页面中,则永远不会调用$http。

上面的解决方案是有效的,但是我不知道这种方法的潜在缺点和内存影响。这是一个有效的解决方案吗?使用RxJs是否有更好/更合适的方法来实现这一点?

非常感谢!

共有3个答案

薄涵衍
2023-03-14

我在这里找到了答案(只是名称略有不同)rxjs在订阅时只使用一次promise

所以对于我的例子,答案很简单:

var loadCountries = function () { return $http.get('/countries'); };

var observable = Rx.Observable.defer(loadCountries).shareReplay();
吕向荣
2023-03-14

使现代化

从rxjs6开始,您可以使用from()

您是否尝试使用rxjs5的fromPromise()API?

检查这里的文档!

劳通
2023-03-14

使用Rx。可见的。fromPromise(promise)

来自promise:

将Promises/符合规范的Promise和/或符合ES2015的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方法是来自

 类似资料:
  • 我想创建一个作为源变量:。 我想创建一个可观察的,每次值更改时都会生成提要。 我是说,当我这样做的时候: 在我的代码的某个地方,我希望收到订阅的提要,等等。。。 有什么想法吗?

  • 假设我有一个,它从网络获取数据并发出数据,如果我订阅这个observable,每次它试图从网络请求数据时,它会很重。 我想创建BehaviorSubject并将其连接到observableA,这样任何其他线程/对象都将订阅BehaviorSubject以获取最新发出的数据。 到目前为止,我还不能用它来编码。我不能创建空的BehaviorSubject并在observableA内调用,因为它们彼此不

  • 我对Observables和RxJs是新手,我想对回报进行调整。如果第一个选择器返回某个值,我希望第二个选择器可以观察到。但是如果第一个选择器没有返回那个特定的值,我想返回false,而不是(false)。我已经走了这么远,但这返回了一个可观察的结果

  • 我正在学习RxJS,对于“听众”在哪里(在可观察的或观察者中),他们是如何订阅/取消订阅的,以及当观察者“不再对”可观察的“不感兴趣”时会发生什么,比如当你使用或。 对于第一部分——什么是订阅什么,什么是倾听者——我对这些陈述之间看似矛盾的地方感到困惑。从http://reactivex.io/rxjs/manual/overview.html我们读到观察者不是观察者的“听众” 这与addEven

  • 我在创建一个将返回对象列表的可观察对象时遇到了麻烦。我有一个ID列表,想对我的数据库提出一个请求。在这种情况下,我使用的是Firebase。当得到一个结果时,我希望将这些对象中的每一个编译成一个列表,然后返回该列表。我需要在返回之前等待所有的对象都返回。我在我的视图模型反序列化器类中这样做。这是我的代码。 有几种方法可以从firebase数据库中返回数据,我可以返回Documentsnapshot

  • 我正在努力理解rxJs观察者/可观察的。 我有一个Angular应用程序,其中一个服务创建一个可观察的: 闲聊服务ts: 当聊天室中收到消息时。服务ts,消息(假定)是多播的: 两个组件以这种方式订阅可观察对象: 问题:只有一个(最后一个订阅的)收到消息。 问:我如何配置可观察到多播到所有订阅者?