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

我应该使用同步Mono::Map还是无同步Mono::FlatMap?

瞿宏儒
2023-03-14

projectReactor文档说明mono::flatmap是异步的,如下所示。

所以,我可以这样写我的所有方法来返回Mono发布者。

public Mono<String> myMethod(String name) {
    return Mono.just("hello " + name);
}

并与mono::flatmap一起使用,如下所示:

Mono.just("name").flatMap(this::myMethod);

公共最终单声道平面映射(函数<?super T,?extends Mono<?extends r>>transformer)

异步转换此单声道发出的项,返回另一个单声道发出的值(可能更改值类型)。

共有1个答案

燕文昌
2023-03-14

这是否使我的方法的执行是异步的?

让我们转到asynchronous的定义:

异步编程是一种并行编程的手段,其中一个工作单元与主应用程序线程分开运行,并通知调用线程它的完成、失败或进展。

在这里,您的工作单元发生在同一个线程中,除非您使用调度程序执行订阅。所以这不是异步的。

这是否使我的代码比仅仅使用Mono::Map更有反应性、更好、更快?

不可能。由于在本例中,发布服务器mono.just(“hello”+name)会立即通知订阅服务器我已经完成了,所以正在进行处理的线程会立即从事件循环中获取该事件并开始处理响应。

相反,这可能会比map在内部引起更多的操作,因为它只是转换元素。

因此,理想情况下,当您有I/O操作(如DB调用)或网络调用时,您应该使用flatmap,这可能需要一些时间,如果所有线程都很忙,您可以在执行其他任务时利用这些时间。

 类似资料:
  • 我目前正在阅读Trevor Burnham的Async Javascript。到目前为止这是一本很棒的书。 他谈到这个片段和console.log在Safari和Chrome控制台中是“异步”的。不幸的是我无法复制这个。代码如下: 如果这是异步的,我会预期结果是books的结果。将console.log()放在事件队列中,直到所有代码执行完毕,然后运行它,它将具有bar属性。 虽然它是同步运行的,

  • 问题内容: 在我的应用程序(node / express / redis)中,我使用一些代码同时更新数据库中的多个项目: 我可以确定在方法返回之前将执行所有这些操作吗?我关心的是异步处理。由于我不在db操作中使用回调函数,因此可以吗? 问题答案: 使用MULTI / EXEC命令创建命令队列并连续执行它们。然后使用回调发送回连贯的响应(成功/失败)。请注意,您必须使用Redis的AOF来避免这种情

  • 问题内容: 我正在编写一个JavaScript函数,该函数发出HTTP请求并返回对结果的承诺(但该问题同样适用于基于回调的实现)。 如果我立即知道为该函数提供的参数无效,该函数应该同步还是应该返回被拒绝的Promise(或者,如果您愿意,请使用实例调用回调)? 异步功能应 始终 以异步方式运行(特别是对于错误情况)有多重要?是否确定,如果你知道程序是不是一个合适的状态的异步操作继续进行? 例如:

  • 问题内容: 我有一种将用于发送电子邮件的方法。我想锁定此方法,以便每次只有一个线程可以访问它,其余线程同时存储。我应该同步方法还是使用spring @transactional PROPAGATION_REQUIRED? 在我的服务层 问题答案: 为什么不通过不使用任何实例级别的东西使该方法成为线程安全的呢? 但是,我看不到Spring的事务管理如何适合这里。我的意思是Spring提供几个事务管理

  • 问题内容: 我意识到这是一个基本问题,但是我在其他地方找不到答案。 是同步还是异步? 万一它是异步的,是否有可能在传播了动作之后添加一个回调,这是可能的? 问题答案: AFAIK,调度动作是同步的。如果您愿意解决异步调用,则可以在redux中使用thunk- middleware ,其中将dispatch作为回调函数提供,您可以根据需要调用它。