Преобразование асинхронного кода NodeJS в Spring Project Reactor

Просто подумал о чем-то другом, что можно было бы сделать. Это очень отличается от моего первого ответа, поскольку он не использует регулярные выражения, поэтому я решил сделать второй ответ.

Используйте эквивалентный метод вашего языка выбора split() в строке со словом отрицать как аргумент о том, на что разделить. Пример с использованием Python:

>>> text = 'barbarasdbarbar 1234egb ar bar32 sdfbaraadf'
>>> text.split('bar')
['', '', 'asd', '', ' 1234egb ar ', '32 sdf', 'aadf']

Приятно, как это сделать, по крайней мере, на Python (я не помню, была ли функциональность такой же, как, например, Visual Basic или Java) , заключается в том, что он позволяет вам опознать, когда «строка» повторялась в строке из-за того, что пустые строки между «барами» включаются в список результатов (хотя пустая строка в начале происходит из-за того, что существует «бар» в начале строки). Если вы этого не хотите, вы можете просто удалить пустые строки из списка.

1
задан ace 15 January 2019 в 18:49
поделиться

1 ответ

Прежде всего, у вас есть логика для генерации токена, если токена нет. Например:

private Mono<String> getToken(String token) {
     return Mono
         .just(token)
         .switchIfEmpty(Mono.just("some token"));
}

В этом случае немного излишне использовать switchIfEmpty для этого, но я предполагаю, что ваш процесс генерации токена немного сложнее, иначе вы могли бы работать с [ 114] вместо (например, token.orElse("some token")).

Кроме того, у нас также есть некоторая логика, чтобы либо найти пользователя по его токену, либо создать нового пользователя, если по данному токену нет пользователя:

private Mono<User> findUserByToken(String token) {
    return userRepository
        .findByToken(token)
        .switchIfEmpty(userRepository.save(new User("John Doe", token)));
}

Теперь, когда у нас есть эти методы, мы можем создать PageView и использовать эти методы по пути. Причина, по которой я начинаю с создания PageView, заключается в том, что это первая «константа» во всем токене, независимо от того, найден ли токен / пользователь:

return Mono
    .just(new PageView(uri))
    .flatMap(pageViewRepository::save)
    .flatMap(pageView -> getToken(token)
        .flatMap(this::findUserByToken)
        .doOnNext(user -> user.setFoo("foo"))
        .doOnNext(user -> user.getPageView().add(pageView)))
    .flatMap(userRepository::save)
    .map(User::getToken);

Теперь, поскольку вам нужен токен добавить к ответу, и я понял, что токен как-то является частью объекта User (иначе UserRepository.findByToken() не сработает?), было бы проще просто использовать User::getToken в конце, чтобы получить токен для передачи на ответ.


Имейте в виду, что шаблон репозитория правильно работает с Spring, но есть только реактивная поддержка для MongoDB, Cassandra, Couchbase и Redis. Кроме этого, есть также реактивная поддержка PostgreSQL через rdbc , но я не думаю, что данные Spring поддерживают это.

0
ответ дан g00glen00b 15 January 2019 в 18:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: