RXJS - Observable.do 不工作

RXJS - Observable.do is not working

我正在尝试 return 一个带有 do 语句的 Observable。 由于某种原因,没有调用 do 语句。 任何帮助将不胜感激:

 public addTarget(video: VideoFile, language?: Language): Observable<Language> {
    if (!this.isTargetCollectionDeclared(video)) {
      video.metadata = video.metadata || <BaseVideoData>{};
      video.metadata.to = [];
    }

    let wasLanguageProvided = language != null;
    if (wasLanguageProvided) {
      video.metadata.to.push(language);
      return Observable.of(language);
    }

    return this._getDefaultFromAvilableLanguages(video)
        .do(languageOrNull => {
          // code is not reaching her
          if (languageOrNull != null) {
            video.metadata.to.push(languageOrNull)
          }
        })
  }

Observables 是惰性的,就像函数一样。除非您订阅它们,否则它们不会 运行,类似于函数在您调用它们之前不会执行的方式。

传递给 .do 的回调将在触发 observable 后执行,这只有在您订阅它后才会发生。

仅在异步内部 _getDefaultFromAvilableLanguages 函数发出值后才在函数内部创建的 .do() 运算符中修改输入参数 video 是很臭的。

这很可能会导致难以调试与视频对象上出现或未出现在预期时刻的语言有关的竞争条件。我建议您将其重构为更纯粹的 return 更新的视频文件:

function enrichVideoWithLanguage(video: VideoFile, language?: Language): Observable<VideoFile> {
  // make sure the metadata object is in the expected state
  if (!this.isTargetCollectionDeclared(video)) {
    video.metadata = video.metadata || <BaseVideoData>{};
    video.metadata.to = [];
  }

  return Observable.of(video)
    .mergeMap(
      (video) => {
        if(language) {
          return Observable.of(language)
            .toArray();
        }
        return this._getDefaultFromAvilableLanguages(video)
          .filter(lang => lang != null)
          .toArray()
      },
      (video, languages: Language[]) => {
        // we used toArray to only modify the video object once
        languages.forEach(lang => video.metadata.to.push(language));
        return video;
      }
    );
}

这仍然有点难闻,因为原始输入 VideoFile 将在此函数内进行修改,但至少可以帮助您确保 enrichVideoWithLanguage 发出的 videoFile 将包含您期望的语言值发射。