Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 将HTTP操作的结果推送到ReplaySubject的最佳实践_Angular_Rxjs_Observable_Reactive Programming - Fatal编程技术网

Angular 将HTTP操作的结果推送到ReplaySubject的最佳实践

Angular 将HTTP操作的结果推送到ReplaySubject的最佳实践,angular,rxjs,observable,reactive-programming,Angular,Rxjs,Observable,Reactive Programming,在Angular 4应用程序中,我需要从HTTP请求中获取一些数据,对这些数据进行一些处理,并将结果推送到ReplaySubject。我正在客户端模拟一些分页代码,因为API还没有完全准备好 我使用的模式是: private searchResultsSource = new ReplaySubject<any>(1); public searchResults$ = this.searchResultsSource.asObservable(); // ... protecte

在Angular 4应用程序中,我需要从HTTP请求中获取一些数据,对这些数据进行一些处理,并将结果推送到
ReplaySubject
。我正在客户端模拟一些分页代码,因为API还没有完全准备好

我使用的模式是:

private searchResultsSource = new ReplaySubject<any>(1);
public searchResults$ = this.searchResultsSource.asObservable();

// ...

protected loadResults() {
  this.apiService
      .get( 'some_url/' ) // this returns a JSON string
      .map( ( results ) => {
        return {
          results: _.chain( results )
                    .drop( this.pageSize * (this.page - 1) )
                    .take( this.pageSize )
                    .value(),
          totalResultsCounts: results.length,
          isLastPage: this.pageSize * this.page >= results.length
        };
      } )
      .subscribe((page) => this.searchResultsSource.next(page));
}
privateSearchResultsSource=新的ReplaySubject(1);
public searchResults$=this.searchResultsSource.asObservable();
// ...
受保护的loadResults(){
这是我们的服务
.get('some_url/')//返回一个JSON字符串
.map((结果)=>{
返回{
结果:链(结果)
.drop(this.pageSize*(this.page-1))
.take(this.pageSize)
.value(),
TotalResultCounts:results.length,
isLastPage:this.pageSize*this.page>=results.length
};
} )
.subscribe((页面)=>this.searchResultsSource.next(页面));
}

我觉得这有点臭。在
subscribe()
中调用
next()
似乎是一种不可靠的模式。有推荐的方法吗

我看不出有什么问题,您正在订阅来自apiService调用的值,然后使用
next
将该值插入主题。我认为这是正确的处理方法。。如果有人对此做了很好的解释,请给我贴上标签:)如果您的需求确实是将一些数据推送到主题中,那么您必须在某个地方调用主题的
next
。最好的地方是观察数据的地方,即
subscribe()
。还要记住,
subscribe
也可以接受一个
Observer
对象,而您的主题实际上是一个
Observer
本身,因此您可以直接传递它,而无需显式调用
next
.subscribe(this.searchResultsSource)
。我想这取决于您以后想对
searchResultsSource做什么。是否需要在其上调用
next
的多个服务?如果是这样,那么你可能已经做对了。还有一个
多播
操作符,您可以使用它来代替您不喜欢的下一个
回调
,但这实际上取决于您的用例。此外,您可能不想使用
.subscribe(this.searchResultsSource)
,因为主题具有内部状态@martin是绝对正确的:不要将主题传递给
subscribe
,除非您希望它也接收来自源的
错误
完成
通知。