亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我如何等待 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 關注
  • 125 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號