gpt4 book ai didi

rx-java - RXJava/Kotlin - 链接单个结果为一个

转载 作者:行者123 更新时间:2023-12-02 03:02:36 27 4
gpt4 key购买 nike

我有一个问题,我不知道如何用更好的方法解决它。问题是我正在请求 Spotify Web API,并且在某些方法中返回艺术家图像,而在其他方法中仅获取基本艺术家信息。

我有这两种方法:

fun getAlbum(albumId: String): Single<SpotifyAlbumDTO>

fun getArtist(artistId: String): Single<SpotifyArtistDTO>

当我得到一张专辑时,艺术家信息不包含艺术家图像 url。因此,我需要调用 getAlbum() 方法并使用结果获取 artistId,然后调用 getArtist() 方法。

我有以下方法来完成所有这些事情:

fun getAlbum(albumId: String): Single<Album>

在这个方法中,我需要调用前两个方法来返回一个 Album 对象(我的域对象)。唯一对我有用的解决方案如下:

fun getAlbum(albumId: String): Single<Album> {
return Single.create { emitter ->
_spotifyService.getAlbum(albumId).subscribe { spotifyAlbum ->
_spotifyService.getArtist(spotifyAlbum.artist.id).subscribe { spotifyArtist ->
val artistImage = spotifyArtist.imageUrl
spotifyAlbum.artist.image = artistImage
emitter.onNext(spotifyAlbum.toAlbum())
}
}
}
}

我认为必须存在另一种更好的方法来执行此操作,而不是在其他订阅中连接订阅调用并创建更深层次的调用。我也尝试以下操作:

_spotifyService.getAlbum(albumId).flatMap { spotifyAlbum ->
_spotifyService.getArtist(spotifyAlbum.artist.id)
}.flatMap { spotifyArtist ->
// Here I don't have the album and I can't to asign the image
}

最佳答案

并行解决方案

要合并多个数据源,最好的运算符是 zip :

Rx Zip operator

Single.zip(getAlbum(albumId), getArtist(artistId),
BiFunction<SpotifyAlbumDTO, SpotifyArtistDTO, SpotifyAlbumDTO> { album, artist ->
val artistImage = artist.imageUrl
album.artist.image = artistImage
album //return value of the merged observable
}
).subscribe { album: SpotifyAlbumDTO?, error: Throwable? ->
emitter.onNext(album.toAlbum())
}

它将并行运行所有 observable,并在每个 observable 完成后执行合并功能。

如果你有更多的可观察到压缩,你可以使用 Function3,Function4,...

顺序解决方案(编辑)

如果并行执行是不可能的,因为您需要按顺序执行请求,那么您可以使用 resultSelector的平面图功能。它在平面图之前采用项目,在平面图之后采用分组集合。这样你就可以很容易地创建你的模型组,而不会混淆 Pair 的用法。

Flatmap with resultSelector

唯一的问题是:Single不支持这种平面图。您可以解决此问题,或者将返回类型从 Single 更改为至 Observable或者只是转换你的 Single在运行时使用 toObservable运营商。

getAlbum(albumId)
.toObservable()
.flatMap({album: SpotifyAlbumDTO -> getArtist(album.artist.id).toObservable()},
{ album:SpotifyAlbumDTO, artist:SpotifyArtistDTO ->
album.artist.image = artist.imageUrl
album
})
}?.subscribe { album: SpotifyAlbumDTO ->
print(album)
}

关于rx-java - RXJava/Kotlin - 链接单个结果为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59708108/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com