Выполните задачу для всех элементов в списке, а затем выполните другую задачу в RxJava.

К сожалению, моя операция REST Delete работает только для одного элемента. Итак, что я пытался сделать, это,

Observable.just(items).flatMapIterable { items -> items }.flatMap {
                //call REST DELETE for every item
            }.flatMap {
                // call REST GET
            }

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

Заранее спасибо.


person sadat    schedule 08.08.2019    source источник
comment
Как я могу дождаться завершения всего выполненного удаления - это зависит от того, какая библиотека используется для вызова операции удаления.   -  person Alexei Kaigorodov    schedule 08.08.2019
comment
Каков тип возврата вызова REST DELETE?   -  person Bach Vu    schedule 08.08.2019
comment
Я не уверен, почему это важно. Допустим, я просто хочу напечатать каждый элемент, а затем напечатать строку «Готово». @АлексейКайгородов   -  person sadat    schedule 08.08.2019
comment
@BachVu это пустота.   -  person sadat    schedule 08.08.2019
comment
это важно. Если вы используете асинхронную библиотеку и вызов API для отдыха возвращает CompletableFuture, то для ожидания всех асинхронных вызовов просто вызовите CompletableFuture.all(). Другие асинхронные библиотеки могут иметь аналогичные возможности. Если вы используете библиотеку синхронизации, вам необходимо преобразовать вызовы синхронизации в асинхронные вызовы с помощью FixedThreadPool.   -  person Alexei Kaigorodov    schedule 08.08.2019


Ответы (2)


В вашем случае вы можете применить toList() вот так

fun doTask(items: List<String>):Observable<Boolean>{
        return Observable.fromIterable(items)
                .flatMap { processItem(it) }
                .toList()
                .toObservable()
                .flatMap { finalTask() }
    }
person Bach Vu    schedule 08.08.2019
comment
Спасибо @Bach Vu, я так и не смог решить проблему из-за возвращаемого типа. Я сделал это весело doTask(items: ArrayList‹String›):Observable‹Boolean›{ return Observable.fromIterable(items) .map { processItem(it) }.doOnComplete { finalTask() } } fun processItem(s: String): Observable‹String› { return Observable.just(s) } fun finalTask(): Observable‹Boolean›{ return Observable.fromCallable { true } } // ошибка в методе do Task - person sadat; 08.08.2019
comment
@sadat Хорошо, потому что вы сказали, что он возвращает void, поэтому я сделал это так, проверьте мой отредактированный ответ :) - person Bach Vu; 08.08.2019

Проблему можно решить с помощью zip. В случае, если кто-то хочет этого

fun doTask(items: ArrayList<String>): Observable<Boolean> {
    val list = arrayListOf<Observable<String>>()
    items.forEach {
        list.add(processItem(it))
    }
    return Observable.zip(list) {
    }.flatMap {
        finalTask()
    }
}

fun processItem(s: String): Observable<String> {
    print(s)
    return Observable.just(s.toUpperCase())
}

fun finalTask(): Observable<Boolean> {
    print("final")
    return Observable.fromCallable { true }
}
person sadat    schedule 08.08.2019