如何在RxJs中构建一个从多个源接收数据的流?

时间:2015-08-17 08:29:20

标签: angular rxjs observable reactive-programming

我正在尝试构建一个包含多个使用服务器事件的组件的应用。该应用程序是在Angular中构建的,并且正在使用rxjs-ng。

我找不到与我的用例匹配的示例。

例如,进行货币更新,其中UI层中有多个订阅者,多个数据访问和业务逻辑提供者(都在客户端)。

我已经实现了一个客户端服务,它获取货币并返回一个observable:

update: function (from, to) {
    var urlForCurrencies = createConverterUrl(from, to);
    var observable = Rx.Observable.fromPromise(
        $http({method: 'JSONP', url: urlForCurrencies})
    );

    return observable;
}

并在UI组件中:

var that = this;
DataService.update(currencyFrom,currencyTo).subscribe(
    function (data) {
        that.currency = data.data.CHF_EUR.val;
    },
    function (err) {
        that.error = err.message;
    }    
);

只有在从UI图层请求时才能使用此功能。

如何发送另一个货币数据更新或从其他视图触发更新并仍使用相同的流/可观察数据?

1 个答案:

答案 0 :(得分:1)

查看有关using subjects的文档。

  

Subject类继承Observable和Observer,因为它既是观察者又是observable。您可以使用主题订阅所有观察者,然后将主题订阅到后端数据源。

您可以使用角度服务共享主题。这样,其他组件可以使用subject.subscribe(onNext,onError,onCompleted)对事件做出反应。可以使用subject.onNext(...)通过主题发送更新。

// Creating a subject
var subject = new Rx.Subject(); 

...

// Handing updates over to the subject
getCurrencyUpdate().then(function(data) {
  subject.onNext(data);
});

...

// Subscribe to the subject to react on updates
subscription = subject.subscribe(
  function (x) { console.log('onNext: ' + x); },
  function (e) { console.log('onError: ' + e.message); },
  function () { console.log('onCompleted'); });
)

通过这种方式,您可以使用主题向订阅者广播数据。