页面刷新时,无法在mergeMap Observable上读取未定义的属性'subscribe'

时间:2018-06-13 01:17:29

标签: angular rxjs angular5 observable angular-services

我遇到这个问题,当我调用以下方法订阅页面刷新时,出现错误“无法读取未定义的属性'订阅'

以下是我的导入:

import {Observable} from 'rxjs/Observable';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import "rxjs/add/operator/mergeMap";

这是我在刷新页面时导致错误的方法:

getChildSubItem(subItemTag:string): Observable<ChildSubItem[]> {
  return this.subItemObservers$.mergeMap(obs => {
     return obs.find(s => s.subItemTag === subItemTag)
               .viewSubItemSource.asObservable();
     });
}

我有很少的属性用于创建BehaviorSubject和BehaviorSubject的Observable。我创建了一个可观察到的用于SubItemObservers的阵列我需要它首先通过另一服务调用来填充。

private subItemObserversSource = new BehaviorSubject<SubItemObservers[]>([]);
private subItemObservers$: Observable<SubItemObservers[]> = new Observable<SubItemObservers[]>();

这是SubItemObservers的类:

export class SubItemObservers {
    subItemTag: string;
    viewSubItemSource: BehaviorSubject<ChildSubItem[]> = new BehaviorSubject<ChildSubItem[]>([]);;
}

基于Google搜索,我需要完成返回Observable对象的方法。但是,我不确定如何使用我的解决方案。有人可以帮助我如何在方法中完成订阅以解决错误。我错过了什么? 谢谢。

1 个答案:

答案 0 :(得分:0)

首先,BehaviourSubject继承了Observable,所以你可能不需要像这样的2个流。

其次,rxjs6最好使用pipe

在getChildSubItem中,您只需拨打this.subItemObserversSource.pipe(mergeMap...)

只要您在声明中初始化subItemObserversSource = new BehaviourSubject,就不会出现任何未定义的错误。

此外,如果obs.find(s => s.subItemTag === subItemTag)返回undefined,请仔细检查def getSkeleton(self): api_key = 'your api key'; app_key = 'your application key'; boards = self.getAll(); # utilizing the api.ScreenBoards.get_all() function boardList = boards['screenboards']; for x in boardList: url = self.target + x['resource'] + "?api_key=" + api_key +"&application_key=" + app_key; data = urllib.urlopen(url).read(); print data

希望它有所帮助。