Котлин, Реактивное программирование: как использовать значение одной функции, выводимой другой - PullRequest
0 голосов
/ 02 января 2019

Я очень новичок в проектной реакторной библиотеке и реактивном программировании с Kotlin, и пытаюсь реализовать такие функции, как flatmap, flatMapIterable, subscribe и т. Д. Теперь проблема в том, что я пытаюсь использовать o / p одной функции в другую, используя flatMapIterable, и после использования я пытаюсь подписать это, передавая выходные данные функции fist и второй функции другой функции нового класса. Теперь, когда я пытаюсь использовать o / p функции 1, я не могу увидеть значение, я вижу только Mono<> или Flux<>.

Ниже приведен фрагмент кода для более подробного объяснения

var result = employerService.getEmployee("Active") // return value is Mono<GetEmployeeStatusListResult>
result.flatMapIterable(GetEmployeeStatusListResult::emps)
      .flatMap {
          employerService.getUsersById(it.userId) // it is of type GetEmployeeStatusListResult.emps and  value returned from employerService.getUsersById(it.userId) is of type GetUserResult class created 
      }.subscribe {
          aService.createContact(result, it)    
      }

Теперь в строке 4 я получаю ожидаемое userId из it.userId, но когда я проверяю результат в строке 6, то я не получаю ожидаемый список значений, он просто предоставляет мне MonomapFuesable, с отображением и источник.

Может ли кто-нибудь помочь мне понять, что мне делать, так как вся моя задача - передать вычисленное значение из строки 1 и строки 4 в функцию строки 6. Пожалуйста, задайте больше вопросов, если я не предоставил необходимую информацию, я новичок в этом. Заранее спасибо !!

[ОБНОВЛЕНИЕ]: я решил проблему следующим образом: `` `

employerService.getEmployee("Active") // return value is Mono<GetEmployeeStatusListResult>
.flatMapIterable(GetEmployeeStatusListResult::emps)
          .flatMap {
              employerService.getUsersById(it.userId).map{x->Pair(it,x)} // it is of type GetEmployeeStatusListResult.emps and  value returned from employerService.getUsersById(it.userId) is of type GetUserResult class created 
          }.subscribe {
              aService.createContact(it.first, it.second)    
          }

`` `

Ответы [ 2 ]

0 голосов
/ 03 января 2019
employerService.getEmployee("Active") // return value is Mono<GetEmployeeStatusListResult>
.flatMapIterable(GetEmployeeStatusListResult::emps)
          .flatMap {
              employerService.getUsersById(it.userId).map{x->Pair(it,x)} // it is of type GetEmployeeStatusListResult.emps and  value returned from employerService.getUsersById(it.userId) is of type GetUserResult class created 
          }.subscribe {
              aService.createContact(it.first, it.second)    
          }

Добавление парной функции для извлечения обоих значений и использования ее в блоке подписки !!Спасибо всем !!

0 голосов
/ 02 января 2019

Трудно понять наверняка по приведенной выше информации, но я думаю, что вызов employerService.getUsersById не возвращает Publisher. Из ваших комментариев я предполагаю, что он возвращает фактическое значение, GetUserResult, а не Mono. Ниже приводится макет набора классов, которые показывают желаемый результат, я считаю. Может быть, сравните ниже с тем, что у вас есть, и посмотрите, сможете ли вы заметить разницу?

data class Employee(val userId: String)
data class GetEmployeeStatusListResult(val emps: List<Employee>)
data class GetUserResult(val employee: Employee)

class EmployerService {
    fun getEmployee(status: String) = Mono.just(GetEmployeeStatusListResult(listOf(Employee("a"))))
    fun getUsersById(userId: String) = Mono.just(GetUserResult(Employee("a")))
}

fun test() {
    val employerService = EmployerService()
    employerService
            .getEmployee("Active")
            .flatMapIterable(GetEmployeeStatusListResult::emps)
            .flatMap {
                employerService.getUsersById(it.userId)
            }.subscribe {
                // Here "it" is a GetUserResult object
            }
}

Если в subscribe вам нужно как начальное значение, полученное из вызова к getEmployee, так и результат вызова к getUsersById, тогда вы можете заключить эти два значения в Pair, как показано ниже:

employerService
        .getEmployee("Active")
        .flatMapIterable(GetEmployeeStatusListResult::emps)
        .flatMap { emp ->
            employerService.getUsersById(emp.userId).map { emp to it }
        }.subscribe {
            // Here "it" is a Pair<Employee, GetUserResult>
        }
...