当前位置: 首页 > 知识库问答 >
问题:

如何等到List

龙承德
2023-03-14

这是我第一次使用webClient,我想知道如何等待列表

List<Address> addresses = collectAllAddresses(someObject);
List<Mono<List<AnotherAddress>>> monoResponses =
        addresses.stream()
                .map(address -> webClientGateway.findAddresses(userData, address.getFullAddress()))
                .collect(Collectors.toList());

Mono.when(monoResponses).block();

log.info("mono responses");
monoResponses.stream()
        .flatMap(it -> Objects.requireNonNull(it.block()).stream()).forEach(it -> log.info("mono responses + {}", it));

以及以下findAddresses方法:

public Mono<List<AnotherAddress>> findAddresses(UserData userData, String fullAddress) {

    if (StringUtils.isEmpty(fullAddress)) {
        log.info("Address is empty that why we return Mono.just(Collections.emptyList()");
        return Mono.just(Collections.emptyList());
    }

    return webClient.get()
            .uri(path, uri -> uri.queryParam("query", fullAddress).queryParam("count", 1).build())
            .header("someHeader", someHeader)
            .retrieve()
            .bodyToMono(new ParameterizedTypeReference<List<AnotherAddress>>() {
            })
            .doOnError(e -> log.error("Error occurred!", e));
}

但每次我执行它时,我总是得到一个空对象的列表,我的意思是我得到一个列表,但是列表中的每个对象都是空的(另一个类的每个字段都是空的)。有什么不对劲?

UDP:更多解释:我有两个微服务。在一个微服务(返回另一个地址)中,有一个RestController发送另一个地址。在另一个微服务中,我想使用WebClient(而不是使用线程池)从以前的微服务调用RestController。当我有以前的实现函数webClientGateway.find地址(userData,address.get全地址()),它返回Mono

共有1个答案

宇文鸿振
2023-03-14

使用助焊剂代替单声道,例如(未测试):

public Flux<AnotherAddress> findAddresses(UserData userData, String fullAddress) {

    if (StringUtils.isEmpty(fullAddress)) {
        log.info("Address is empty that why we return Mono.just(Collections.emptyList()");
        return Flux.empty();
    }

    return webClient.get()
            .uri(path, uri -> uri.queryParam("query", fullAddress).queryParam("count", 1).build())
            .header("someHeader", someHeader)
            .retrieve()
            .bodyToFlux(AnotherAddress.class)
            .doOnError(e -> log.error("Error occurred!", e));
}

如果你不需要按地址分组的另一个地址列表,你可以使用这样的东西(未经测试):

Flux<AnotherAddress> anotherAddressFlux= Flux.fromIterable(addresses)
                .flatMap(address -> webClientGateway.findAddresses(userData, address.getFullAddress()));

如果你想阻止你可以使用:

List<AnotherAddress> anotherAddressList = anotherAddressFlux.collectList().block();
 类似资料:
  • 这是一个提倡的范例,即 wait() 应该在同步块内的 while 循环中调用。 我的问题是,waiting()线程如何获得锁? 考虑线程1首先运行并开始等待条件。它释放锁,线程2获得锁设置条件并通知线程1。现在线程1获得锁,检查条件并开始执行“做某事”。 我的问题是当线程1被通知它从time条件开始执行时,已同步(mon)的代码行永远不会再次执行,那么线程1如何获得锁?将锁还给线程1的内部动态是

  • 问题内容: 我正在开发Chrome中的扩展程序,但我想知道:找出元素何时存在的最佳方法是什么?使用纯JavaScript,间隔检查直到元素存在,或者jQuery是否有一些简单的方法来执行此操作? 问题答案: 由于性能问题,不建议将其与其他DOM突变事件一起弃用- 推荐的方法是使用MutationObserver来监视DOM。不过,只有新的浏览器才支持此功能,因此您应该在不可用时退回。

  • 问题内容: 我正在加载模板,然后使用服务针对我的范围对其进行编译。 然后在弹出窗口中使用它 我的模板非常复杂,可能要花一些时间来编译。 在弹出窗口中使用angular之前,如何确保angular完成了模板的编译? 编辑 :在创建弹出窗口之前,我试图将角度强制为,它确实可以工作,但会生成JavaScript错误,这对我来说是不可接受的。 问题答案: 允许您使用所谓的克隆附加功能,该功能允许您将元素附

  • 我希望能够等待一个可观察的时间,例如。 天真的尝试会导致等待立即解析,而不会阻止执行 编辑:我的全部预期用例的伪代码是: 我知道我可以将其他代码移动到另一个单独的函数中,并将其传递到subscribe回调中,但我希望能够避免这种情况。

  • 我在我的应用程序中使用SWT浏览器。我需要在浏览器中的超文本标记语言页面上运行脚本。但是脚本是在页面完全加载之前运行的。所以我如何让应用程序等待,直到浏览器完成加载。我曾经尝试过这样的事情。 但是这样不行! 这类似于JavaSWT浏览器:等待动态页面完全加载,但没有解决方案。

  • 但是它抛出了-看起来像期望元素在那里,所以这是有缺陷的。这对硒来说一定是面包和黄油,不想推倒重来……有没有人可以提出一个替代方案,理想情况下不滚动我自己的?