Как получить ранее переданную переменную в реакторе? - PullRequest
0 голосов
/ 12 марта 2019

Я делаю бот разногласий как личный проект, построенный поверх проекта-реактора?

Мне нужно вызвать функцию, которая должна получить переменную, которая передается дальше по цепочке.

Из приведенного ниже кода мне нужно передать два аргумента. Первому нужен аргумент из события MessageCreateEvent, а второму - getContent.

Как я могу это сделать, я новичок в использовании реактора.

    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 голосов
/ 12 марта 2019

flatMap в порядке. Ошибка, вероятно, в другом месте, чем вы ожидаете. Это может помочь вам разобраться в том, что происходит (при условии, что у вас есть доступный объект logger, называемый «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();

но это не делает ваш код чище! Для некоторых других случаев это может быть удобно.

...