RXJS - Observable.do无法正常工作

RXJS - Observable.do无法正常工作

问题描述:

我试图用do语句返回Observable。 由于某种原因,不会调用do语句。 任何帮助将appreicated:RXJS - 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) 
 
      } 
 
     }) 
 
    }

+0

您是否订阅了observable? – echonax

+1

你如何调用'addTarget'? –

+0

addTarget()订阅() – Milad

观测值都懒,喜欢的功能。除非你订阅它们,否则它们将不会运行,类似于在你调用它们之前函数不会执行。

调用传递给.do将在observable被触发时执行,只有在订阅了它后才会发生。

+0

OP已在评论中说明了该方法已订阅。 – echonax

+1

我的错误。它被从另一个地方从视图中调用。非常感谢 –

+1

@ user3554268那么这个答案如何解决你的问题?如果这是你自己的错字/错误,你应该删除这个问题。 – echonax

修改输入参数video.do()运算符内部创建的函数内部只有在异步内部_getDefaultFromAvilableLanguages函数发出一个值之后才会很臭。

这很可能会导致很难调整与视频对象上显示的语言有关的竞争条件,或者在预期的时间内无法调试。我建议你重构这个更纯,并返回一个更新的录像档案:

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; 
     } 
    ); 
} 

这仍然是一个有点臭,因为原始输入录像档案将得到修改这个功能里面,但至少可以帮助您确保由enrichVideoWithLanguage发出的videoFile将包含您在发射后直接预期的语言值。