如何在reactor中获取先前传递的变量?

问题描述 投票:0回答:1

我正在制作一个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();
java project-reactor reactor
1个回答
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();

但这不会让你的代码变得更干净!但对于某些其他情况,它可以很方便。

© www.soinside.com 2019 - 2024. All rights reserved.