我没有在Angular 2中使用此功能,但目前可以正常使用:
myFunction(): Observable<Song> {
return this.user.getSong$()
.mergeMap((track: Track) => {
if (track.isSingle()) {
return this.getSingle(track.getId());
} else {
throw 'error';
}
});
}
但是我很难理解一些事情。 第一个问题:我已经读了一个绝对的 ton ,但是我无法理解mergeMap
和map
之间的区别。我不了解mergeMap
的作用。为什么在mergeMap
这里?
现在我要解决的实际问题。我需要进行一次HTTP调用,并在返回任何内容之前完成它。我为此做了另一个函数,该函数返回一个Observable
:
populate(sourceType: string, sourceId: number): Observable<object> {
return this.http.get(`//populate/${sourceType}/${sourceId}`)
.map((response: Response) => {
return <string[]> response.json();
});
}
当我尝试将其与其他功能结合使用时,我得到:
myFunction(): Observable<Song> {
return this.user.getSong$()
.mergeMap((track: Track) => {
if (track.isSingle()) {
this.populate('list', track.getId()).subscribe(
() => {}, // I don't care what the request returns,
() => {}, // or if it returns an error.
(result) => { // I only care when it's done.
return this.getSingle(track.getId());
}
);
} else {
throw 'error';
}
});
}
这根本不起作用,但是我无法调试错误控制台输出,也不知道如何使其工作。帮助吗?
TypeError: undefined is not iterable (cannot read property Symbol(Symbol.iterator))
at Object.subscribeToResult (Rx.js?1551417548052:8237)
at MergeMapSubscriber._innerSub (Rx.js?1551417548052:3336)
at MergeMapSubscriber._tryNext (Rx.js?1551417548052:3333)
at MergeMapSubscriber._next (Rx.js?1551417548052:3318)
at MergeMapSubscriber.Subscriber.next (Rx.js?1551417548052:10743)
at MapSubscriber._next (Rx.js?1551417548052:4975)
at MapSubscriber.Subscriber.next (Rx.js?1551417548052:10743)
at MapSubscriber._next (Rx.js?1551417548052:4975)
at MapSubscriber.Subscriber.next (Rx.js?1551417548052:10743)
at MapSubscriber._next (Rx.js?1551417548052:4975)
答案 0 :(得分:0)
只需尝试以下方法。关于mergeMap
是什么,我认为您需要花一些时间来学习Rxjs,在线上有很多资源。简而言之,mergeMap
类似于promise。然后与promise不同。然后您可以在其中返回值或另一个promise,使用mergeMap
您需要在其回调中返回Observable。
myFunction(): Observable<Song> {
return this.user.getSong$()
.mergeMap((track: Track) => {
if (track.isSingle()) {
return this.populate('list', track.getId()).pipe(
mergeMap(_=>this.getSingle(track.getId())
);
} else {
throw 'error';
}
});
}