Использование данных из другой наблюдаемой - PullRequest
0 голосов
/ 28 марта 2020

Мне не удается войти в образ мышления ReactiveX, или кодовая база, в которой я работаю, просто плохо написана.

Предположим, у меня есть некоторая наблюдаемая A () и мне нужны данные из другой наблюдаемой B () в Чтобы выполнить проверку данных, поступающих через A, как мне выполнить sh это в Rx Java (предпочел бы реализацию Rx Kotlin). Обратите внимание, что и A, и B возвращают одиночный список объектов.

fun B(): Single<List<Bar>> {
  ...
}

fun A() : Single<List<Foo>> {
  Single.just(readRecords()).map { record ->
    // val bar = B.getAll()??? This seems like an anti-pattern and I'm not sure if it would necessarily be right to .subscribe()???

    if (bar.contains(record)) {
      // ... some validation
    }
  }
}

Обновление 1: следует подчеркнуть, что для проверки требуется несколько источников, чтобы вы могли иметь B, C, D и т. Д. 1011 *.

1 Ответ

0 голосов
/ 30 марта 2020

Таким образом, вы можете использовать оператор .map {}:

fun A() : Single<List<Foo>> {
    return B.getAll().map { allFromB ->  
        val record = readRecords()
        if (allFromB.contains(record)) {
           // ... some validation
        }
        ...
    }
}

ОБНОВЛЕНИЕ , если таких наблюдений мало, вам нужно использовать Observables.combineLatest() или Observable.combineLatest() (зависит от RX версия, которую вы используете):

fun B(): Single<List<BarB>> {
   ...
}

fun C(): Single<List<BarC>> {
   ...
}

fun D(): Single<List<BarD>> {
   ...
}

fun A() : Single<List<Foo>> {
    return Observable.combineLatest(B.getAll(), C.getAll(), D.getAll) { barB, barC, barD -> 
            val record = readRecords()
            //Do your staff here with all this vals and return List<Foo>
        }
}
...