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

Spring reactor webclient使用flatmap和takewhile进行顺序请求

慕朝明
2023-03-14

我想从第三方资源检索所有页面。为此,我写了这个:

final WebClient webClient = WebClient.builder()
     .baseUrl("http://resource.com")
     .build();
Flux.fromStream(IntStream.iterate(0, i -> i + 1).boxed())
     .flatMap(i -> webClient.get()
          .uri("/data?page={page}", i)
          .retrieve()
          .bodyToMono(Page.class))
     .takeWhile(Page::isMoreAvailable)
     .flatMapIterable(Page::getData)

但它不能正常工作flatMap被多次调用,在takeWhile检索第一个响应之前,它会使用不同的页面执行多个请求。

如果我改成这个:

.map(i -> webClient.get()
        .uri("/data?page={page}", i)
        .retrieve()
        .bodyToMono(Page.class)
        .block())

效果很好。

那么,我如何使用平面地图实现这一点呢?

共有1个答案

甄越
2023-03-14

平面图处理是并发的

.flatMap(i -> webClient.get()
   .uri("/data?page={page}", i)
   .retrieve()
   .bodyToMono(Page.class), 1)

成功了。

 类似资料:
  • 问题内容: 假设我有以下代码: 输出是相同的线程名称,因此这里没有任何好处-我的意思是,只有一个线程可以完成所有工作。 里面是这段代码: 我知道如果“外部”流是并行的(可能会阻塞),则强制该属性,“外部”将不得不等待“ flatMap”完成,反之亦然(因为使用了相同的公共池),但是为什么 总是 强迫那个? 那是在以后的版本中 可能会 更改的事情之一吗? 问题答案: 有两个不同方面。 首先,只有一个

  • 本文向大家介绍Swift 进阶 —— map 和 flatMap的使用,包括了Swift 进阶 —— map 和 flatMap的使用的使用技巧和注意事项,需要的朋友参考一下 map 和 flatMap 主要分在集合上的使用和在可选类型上的使用,下面分别来看下。 集合上使用 map 和 flatMap 先看如下的代码: 输入是一个一维数组,转换后 infos1 的结果是如下的一个二维数组,所以 m

  • 为了让客户帐户更加安全,精心设计的密码是一个好的做法。这是我用于密码验证的正则表达式字符串。 代表: < li>8个或更多字符。 < li >大写字母A-Z < li >小写字母a-z <李>特殊字符~!@#$%^ 数字和/或字母顺序为3或以上是不合适的。 例子: 不OK = efg123!美元,ABC 567%,xyz789^ 谢谢你

  • 问题内容: 我想以这种方式进行Ajax调用的堆栈:call(n-1)完成后,call(n)开始… 由于多种原因,我无法使用 async:false : 一些请求可能是 jsonp (最相关) 我还有其他一些可能同时起作用的ajax请求。 浏览器被阻止 我无法以这种方式链接我的请求: 因为请求的数量和参数是根据用户输入动态创建的。 一个小例子说明了我的问题。 您将看到服务器响应顺序是随机的,我要实现

  • takeWhile 镜像一个 Observable 直到某个元素的判定为 false takeWhile 操作符将镜像源 Observable 直到某个元素的判定为 false。此时,这个镜像的 Observable 将立即终止。 演示 let disposeBag = DisposeBag() Observable.of(1, 2, 3, 4, 3, 2, 1) .takeWhile

  • Creates a new sequence comprising the elements from the head of this sequence that satisfy some predicate. Once an element is encountered that doesn't satisfy the predicate, iteration will stop. Signa