我正在将不和谐的机器人作为一个基于项目反应器的个人项目吗?
我需要调用一个函数,该函数需要获取一个在链上进一步传递的变量。
从下面的代码中,我需要传递两个参数。第一个需要MessageCreateEvent事件的参数,第二个需要getContent的参数。
我该怎么做,我是使用Reactor的新手。
discordClient.getEventDispatcher().on(MessageCreateEvent.class)
.map(MessageCreateEvent::getMessage)
.map(Message::getContent)
.filter(Optional::isPresent)
.map(o -> o.get())
.map(this::getCommand)
.filter(Objects::nonNull)
.map(msg -> msg.runCommand(null, null))
.subscribe();
我也尝试过此操作,但没有看到runCommand()被调用。:
discordClient.getEventDispatcher().on(MessageCreateEvent.class)
.flatMap(event ->
Mono.just(event)
.map(MessageCreateEvent::getMessage)
.map(Message::getContent)
.filter(Optional::isPresent)
.map(o -> o.get())
.map(this::getCommand)
.filter(Objects::nonNull)
.map(msg -> msg.runCommand(event, null))
)
.subscribe();
答案 0 :(得分:0)
flatMap很好。该错误可能与您预期的不同。这可能有助于您确定正在发生的情况(假设您有一个名为“ log”的记录器对象):
Mono.just(event)
.doOnNext(log::info)
.map(MessageCreateEvent::getMessage)
.doOnNext(log::info)
,依次类推。在最后一行,您可能要添加:
.doOnEach(s -> log.info("signal: " + s)))
仅供参考,或者对于偶然发现此问题的其他人,从技术上讲, 是一种使用链条中传递的东西zipWhen()的方法:
discordClient
.getEventDispatcher()
.on(MessageCreateEvent.class)
.zipWhen(
event ->
Mono.just(event)
.map(MessageCreateEvent::getMessage)
.map(Message::getContent)
.filter(Optional::isPresent)
.map(o -> o.get())
.map(this::getCommand)
.filter(Objects::nonNull),
(event, msg) -> msg.runCommand(event, null))
.subscribe();
但这不会使您的代码更清晰!但是,对于某些其他情况,它可能很方便。