在 Mono\Flux 上映射和订阅之间的区别?

Difference between map and subscribe on Mono\Flux?

我是否可以假设 "map" 本质上是 "subscribe" 和 return 类型。当承诺得到解决时,它们似乎都被异步调用?

例如,如果我同时分派 3 个异步调用的列表,以下面的方式应用映射操作会阻塞吗?

 Flux.merge(albums.stream().map(album -> {

        Mono<CoverResponse> responseMono  = clientRequestHandler.makeAsyncCall()

           //2.call and handler for async call
           return responseMono
                   .map(response -> processResponse());

       }).collect(Collectors.toList())).then(Mono.just(monoResponse));

在上面的代码片段中,每个地图操作都会阻塞吗?如果说,第一个调用到 return 需要 5 毫秒,而每个其他调用到 return 需要 2 毫秒,我们是否要等待 3ms+2ms+2m = 7ms 进行 enitre 操作?或者只有 3 毫秒,因为一旦第一个调用得到解决,那么 2 毫秒的调用就已经解决了。

首先,在有人订阅之前,什么都不会发生。订阅是链中的最后一件事,它将触发所有事件的开始。

其次,您需要了解 运行 并行处理与 运行 并行处理 non-blocking.

的区别

要解析您的第一张地图,它需要进行其余调用,然后根据需要进行第二张地图的响应。这两个不会运行并列。

你的 responseMono.map 不可能是 运行 直到 Mono<Response> responseMono 确实有东西在里面。将其视为一个 Promise,它将在问题已解决时向应用程序发出信号。

或者您可以将其视为回调链。

所以在你的例子中你正在做一个 clientRequestHandler.makeAsyncCall() 但你返回一个 Mono<CoverResponse> 下一部分 responseMono.map 不会触发,直到有一个 CoverResponse单声道。因此,您的 "async" 调用可能是异步的,但仍然遵循列表顺序,因为它全部在顺序流中。

但是map是映射函数。它从盒子里拿出一些东西,对盒子里的东西进行计算,然后 returns 新值或类型。

React 比其他选项更好的原因在于,当您在需要时间的地方进行 side effect 远程调用时,正在处理它的线程不会挂起并等待外部请求完成,它将开始做其他事情,比如处理其他请求。

然后当 Mono<Response> 通知系统有 "something in the box" 响应时,同一线程或任何其他可用线程将继续处理请求。