如何在反应堆中获取先前传递的变量?

时间:2019-03-12 06:34:07

标签: java project-reactor reactor

我正在将不和谐的机器人作为一个基于项目反应器的个人项目吗?

我需要调用一个函数,该函数需要获取一个在链上进一步传递的变量。

从下面的代码中,我需要传递两个参数。第一个需要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();

1 个答案:

答案 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();

但这不会使您的代码更清晰!但是,对于某些其他情况,它可能很方便。