2017-05-04 26 views
0

根据此文档https://xgrommx.github.io/rx-book/content/observable/observable_instance_methods/index.html,Observable方法和Observable实例方法之间存在主要分离。我知道Observable方法总是在Observable实例方法之前调用。希望这是真的。但是我们可以使用什么顺序来组合/混合Observable实例方法?可以使用RxJS操作符的顺序

我有什么要解决的问题是为什么两个类似的Observables的结果是不一样的。

第一个:

let getRequestJson = this.http.get(this.config.apiUrl + '/users', new RequestOptions({params: this.params})) 
    .map((response: Response) => response.json()); 
console.log(getRequestJson); 

let doThroughTheJsonData = getRequestJson.do(data => { 
    this.count = data.count; 
    this.loading = false; 
    this.currentPage = page; 
}); 
console.log(doThroughTheJsonData); 

this.asyncUsers = doThroughTheJsonData.map(data => { 
    return data.user; 
}); 
console.log(this.asyncUsers); 

输出:

Observable {_isScalar: false, source: Observable, operator: MapOperator} 
Observable {_isScalar: false, source: Observable, operator: DoOperator} 
Observable {_isScalar: false, source: Observable, operator: MapOperator} 

二之一:

this.params.page = page; 
    let options = new RequestOptions({ params: this.params }); 

    let getRequest = this.http.get(this.config.apiUrl + '/users', options); 
    console.log(getRequest); 
    let doThroughTheData = getRequest.do(data => { 
     this.count = data.json().count; 
     this.loading = false; 
     this.currentPage = page; 
     }); 
    console.log(doThroughTheData); 
    this.asyncUsers = doThroughTheData.map((response: Response) => response.json().users); 
    console.log(this.asyncUsers); 

输出:

Observable {_isScalar: false, source: Observable, operator: CatchOperator} 
Observable {_isScalar: false, source: Observable, operator: DoOperator} 
Observable {_isScalar: false, source: Observable, operator: MapOperator} 

最后,我在asyncUsers中收到的内容看起来像不同的Observable,虽然应该是相同的。 在第一个我做 1. MAP上的数据转换为json格式的数据。 2.然后可观察到的DO从json数据获取一些数据 3.我再次使用MAP从json数据获取用户数据。

在第二个我做 1.第一DO和里面我第一次传输的响应数据JSON和我得到了我需要的 2.然后映射转型为JSON并获得唯一从JSON数据的用户数据。

是这个问题可观察的具体,它是关系到方法map-do-map/do-map的顺序,或者是明确的typescript错误。

回答

2

在调用它的方法之前,您需要一个Observable的实例。要创建一个Observable,您可以提供一个Observable,或者使用静态方法/构造函数创建一个Observable。

一般Rx工作流程:

  • 得到一些观察,(外部/静态方法)
  • 转变可观察(实例方法)
  • subscribe获取数据出来

获取a Observable

var instance = Rx.Observable.of(1, 2, 3) 

给你的值的流1,2和3

var instance = new Rx.Observable(observer => { 
    /* do whatever you want with observer 
    for example: */ 
    observer.next(1) 
    observer.next(2) 
    observer.next(3) 
    observer.complete() 
}) 

给你一个同样表现观察到。

你也可以从外部获得Observables:在你的例子中http.get返回一个Observable。

使用/改造可观察

创建后/检索到的可观察到的,可以使用可观测实例任何方法来将流或它的内容。

例如:

var doubled = instance.map(x => x * 2) 

这里面的一切加倍。 instance未被修改。您创建了一个新的Observable实例doubled,它的行为相同,但值增加了一倍。

有许多运营商。完整列表见http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html

使用可观察

这是你从可观察提取数据。这是你会做副作用的地方。您可以拨打subscribe,每次有新数据可用时,都会调用您的回调。

doubled.subscribe(x => view.x = x) 

你的情况:

var subscription = getRequestJson.subscribe(data => { 
    this.count = data.count; 
    this.loading = false; 
    this.currentPage = page; 
}); 

你得到了调用subscribe的是一个对象,你可以用它来让源知道你不再有兴趣。 subscription.unsubscribe()确保您的回调不再被调用。

你的样品

你似乎日志可观察的本身,而不是值内。查看Observable作为数据如何流动的蓝图。本身并不是那么有趣,有趣的是里面有什么。因此请使用subscribe来获取这些数据。

您使用.do(...)设置一些值,不要做do;)。如果您始终使用.do,您可能会遇到实际上没有任何事情完成的情况:如果您从未致电订阅,则永远不会让源知道您有兴趣。

如果您使用的是Angular类型,Angular可能会为您做subscribe调用,但前提是您将Observable移交给Angular。如果让它松动,则不会创建订阅。

+0

感谢您的链接。我搜索了很好的链接,但没有成功。是的,我使用Angular,这就是为什么我直接使用页面中的observable。我的理解是,问题不在于调用方法的顺序,并且在仅涉及Observable实例方法时没有特定的顺序。所以我会在观察者内部进一步搜索。谢谢。我使用了方法DO,因为我需要Web Service返回的部分数据,但是在这种情况下,asyncUsers的页面的可观察性只是用户数组。所以我只需要数组之前的数据 – makkasi