【问题标题】:Perform a task for all items in a list and then perform another task in RxJava对列表中的所有项目执行一个任务,然后在 RxJava 中执行另一个任务
【发布时间】:2019-08-08 02:58:31
【问题描述】:

不幸的是,我的 REST 删除操作仅适用于一项。所以我想做的是,

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

问题是每个项目都调用了 GET 调用。如何等待完成所有删除操作然后执行 GET 调用?

提前致谢。

【问题讨论】:

  • “我怎样才能等待完成所有删除操作” - 这取决于使用什么库来调用删除操作。
  • REST DELETE 调用的返回类型是什么?
  • 我不知道为什么这很重要。可以说,我只想打印每个项目,然后打印一个字符串“完成”。 @AlexeiKaigorodov
  • @BachVu 无效。
  • 这很重要。如果您使用异步库并调用 rest api 返回 CompletableFuture,那么要等待所有异步调用,只需调用 CompletableFuture.all()。其他异步库可能有类似的设施。如果使用同步库,则需要使用 FixedThreadPool 将同步调用转换为异步调用。

标签: java android kotlin rx-java rx-kotlin


【解决方案1】:

在你的情况下,你可以像这样申请toList()

fun doTask(items: List<String>):Observable<Boolean>{
        return Observable.fromIterable(items)
                .flatMap { processItem(it) }
                .toList()
                .toObservable()
                .flatMap { finalTask() }
    }

【讨论】:

  • 感谢@Bach Vu,由于返回类型,我仍然无法解决问题。我做了这个有趣的 doTask(items: ArrayList):Observable{ return Observable.fromIterable(items) .map { processItem(it) }.doOnComplete { finalTask​​() } } fun processItem(s: String): Observable { return Observable.just(s) } fun finalTask​​(): Observable{ return Observable.fromCallable { true } } //do Task 方法出错
  • @sadat 好的,因为你说它返回 void 所以我这样做了,检查我编辑的答案:)
【解决方案2】:

这个问题可以用 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 }
}

【讨论】:

    【解决方案3】:
    Observable.just("one", "two", "three", "four", "five").subscribe(new Consumer<String>() {
                @Override
                public void accept(String s) throws Exception {
                    Log.d("ffff", s);//print: one, two, three, four, five
                }
            }, new Consumer<Throwable>() {
                @Override
                public void accept(Throwable throwable) throws Exception {
    
                }
            }, new Action() {
                @Override
                public void run() throws Exception {
                    Log.d("ffff", "complete");//print: complete
                }
            });
    

    【讨论】:

      猜你喜欢
      • 2020-01-21
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多