我正在制作一个discord bot作为一个建立在项目反应堆之上的个人项目?
我需要调用一个函数,该函数需要获取一个在链中进一步传递的变量。
从下面的代码中,我需要传递两个参数。第一个需要来自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();
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();
但这不会让你的代码变得更干净!但对于某些其他情况,它可以很方便。