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)
}
})
}
答
修改输入参数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将包含您在发射后直接预期的语言值。
您是否订阅了observable? – echonax
你如何调用'addTarget'? –
addTarget()订阅() – Milad