6

我有一个 MeetingService,它通过 Horizo​​nIO 从我的 RethinkDB 中获取数据。当尝试通过其 ID 获取会议时,我总是会得到一个空值作为响应。此服务中的其他方法可以正常工作。

会议服务.ts:

getMeetingById(passedId: string): Observable<Meeting[]> {
    return this.table.find({meetingId: passedId}).fetch();
}

会议细节.component.ts:

currentMeeting: Meeting;

getCurrentMeeting(): void {
    this._meetingsService.getMeetingById(this.passedId).subscribe(
        (returnMeetings: Meeting[]) => {
            this.currentMeeting = returnMeetings[0];
        }
    );
}

即使我将passedId 更改为直接从数据库(通过管理面板)获得的ID,该方法仍然返回null。

如果我更改代码以返回表中的第一个值,那么一切都会正常工作。

getMeetingById(passedId: string): Observable<Meeting[]> {
    return this.table.order("meetingId", "descending").limit(1).fetch();
}

在我看来,最终结果是 currentMeeting var 上未定义的错误:

EXCEPTION: Error in ./MeetingDetailComponent class MeetingDetailComponent - inline template:1:4 caused by: 
Cannot read property 'meetingId' of undefined

编辑:显示不同实现的附加代码:

load() {
    if(this.passedId != null) {
      this._feedService.GetFeedById(this.passedId).subscribe(
          (returnFeed: Feed[]) => {
            this.currentFeed = returnFeed[0];
          }
      );
    } else {
      this._feedService.GetFirstFeed().subscribe(
          (returnFeed: Feed[]) => {
            this.currentFeed = returnFeed[0];
          }
      );
   }
}

第二个有效,第一个无效。传递的 id 是正确的,并且在数据库中也可用,所以这很令人困惑。

提前致谢。

4

1 回答 1

3

尽管似乎没有人关心这个问题,但我找到了一个比较有效的答案。我的临时修复涉及获取整个表并通过 a for each 手动查找正确的 id,但也可以像这样:

  1. 创建一个变量,它是您需要的表的可观察变量(通过 .watch())
  2. 调用 flatMap() 并获取 observable 数组(如果有人知道为什么这是必要的,请告诉我)
  3. 使用 find() 和 lambda 调用正确的 id。

    getMeetingById(passedId: string): Observable<IMeeting> {
        var allMeetings: Observable<Meeting[]>;
        allMeetings = this.table.watch();
    
        return allMeetings.flatMap((meetings: IMeeting[]) => Observable.from(meetings))
                          .find((meeting: IMeeting) => (meeting.id == passedId));
    
    }
    
于 2017-03-14T11:34:56.977 回答