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

How to get a previously passed variable in reactor?

我正在将 discord 机器人作为个人项目构建在 project-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();

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

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