为了账号安全,请及时绑定邮箱和手机立即绑定

我如何等待 List<Mono> 得到解决?

我如何等待 List<Mono> 得到解决?

慕容森 2023-02-23 16:49:21
我希望能够等待 Monos 列表得到解决,并在完成最后一个元素后,继续进行另一个异步调用public Mono<Artist> getArtistInfo(String id) {    //Call API1    Mono<MusicResponse> musisResponseMono = webClientBuilder                                                .build()                                                .get()                                                .uri(uri + "\\" + id)                                                .retrieve()                                                .bodyToMono(MusicResponse.class);    //1.async handler for the first call    return musisResponseMono.flatMap(musicRes ->{        Artist artist = new Artist();        List<Albums> albums = musicRes.getAlbums();        //make mutiple concurrent API calls to API2        albums.stream().forEach( album -> {            webClientBuilder                .build()                .get().uri("API 2 URL")                .retrieve()                .bodyToMono(Covers.class)                .subscribe(cover -> artist.getAlbums().add(cover.getImage()));        });        //call API3 - want to wait untill all API calls 2 are completed        return webClientBuilder            .build()            .get()            .uri("API3 URL")            .retrieve()            .bodyToMono(Profiles.class)            .map( profileRes ->                artist.setDescription(profileRes.getDescription())            );    }    }问题是 API 调用 3 可能在返回第二个调用的每个元素之前返回。我想我正在寻找的是 Spring Webflux 上下文中 Javascipt 中的 asycn await 之类的东西
查看完整描述

1 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

我认为这应该有效。


我们首先获取艺术家并映射响应。在映射期间,我们获取每个专辑封面并获得一个List<Mono<Cover>>块。


然后我们将它们合并到一个中,当它们可用时Flux#merge将发出每个。Cover所以我们可以在每个上发出doOnNext并将它们附加到艺术家。


完成后,我们只需then返回艺术家对象。


在这些事件链之后,我们可以doOnSuccess第二次获取并将更多信息附加到Artist对象。


public Mono<Artist> getArtistInfo(String id) {

    return webClient.get()

            .uri("/artist")

            .retrieve()

            .bodyToMono(ArtistResponse.class)

            .flatMap(artistResponse -> {

                final Artist artist = new Artist();

                return Flux.fromIterable(artistResponse.getAlbums())

                        .parallel(2)

                        .runOn(Schedulers.parallel())

                        .map(albums -> webClient.get()

                                .uri("artist/albums")

                                .retrieve()

                                .bodyToMono(Covers.class))

                        .doOnNext(coversMono -> coversMono

                            .doOnSuccess(covers -> artist.getAlbums().add(covers)))

                        .thenReturn(artist);

            })

            .doOnSuccess(artist -> webClient.get()

                    .uri("/artist/profile")

                    .retrieve()

                    .bodyToMono(Profiles.class)

                    .doOnSuccess(profiles -> artist.setDescription(profiles.getDescription())));

}

没有运行代码,所以不能保证它,但至少它会给你一些洞察力,并在路上迈出一步。


查看完整回答
反对 回复 2023-02-23
  • 1 回答
  • 0 关注
  • 83 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信