首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调用rest异步并等待直到所有调用都在rx-android中完成。

如何调用rest异步并等待直到所有调用都在rx-android中完成。
EN

Stack Overflow用户
提问于 2018-03-25 12:04:47
回答 1查看 988关注 0票数 2

在一个活动中,我需要调用4 rest。一个API不依赖于另一个API。但是为了计算,我需要所有4个API的数据。因此,我计划调用API异步,但等待所有API完成加载。我正在用RxAndroid进行改装。我不知道如何使用rx来实现这一点。我不想对每个API调用使用布尔值来跟踪它是否加载。有什么rx路吗?

现在,我将所有调用同步如下

样本代码:

代码语言:javascript
复制
fun getData() {
    val disposable = dataSource.getLivePayments()
                        .subscribeOn(schedulerProvider.io())
                        .observeOn(schedulerProvider.ui())
                        .subscribe(({ livePayments: List<Payment> ->
                            this.livePayments.clear()
                            this.livePayments.addAll(livePayments)

                            dataSource.getLiveRemittances()
                                .subscribeOn(schedulerProvider.io())
                                .observeOn(schedulerProvider.ui())
                                .subscribe(({ liveRemittances: List<Remittance> ->
                                    this.liveRemittances.clear()
                                    this.liveRemittances.addAll(liveRemittances)

                                    // similarly called dataSource.getLiveTimeSheets()
                                    // and dataSource.getArchiveTimeSheets()
                                    // synchronous
                                    // then call 
                                    calculateAmount()
                                }), ({ t -> this.parseError(t) }))
                        }), ({ t -> this.parseError(t) }))

    compositeDisposable.add(disposable)
}

fun calculateAmount() {
 val balance = if(liveRemittances.isNotEmpty()) {
    (sum(payment.amount) - sum(timesheet.amount)) * sum(liveRemittance.amount)
    } else {
        (sum(payment.amount) - sum(timesheet.amount))
    }
}

NB:在这个过程中,如果某个API失败,它将停止执行下一个API,但我希望它应该调用next API。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-25 12:11:57

如果所有API调用都是独立的,则可以使用zip操作符:

代码语言:javascript
复制
Single.zip(single1, single2, ..., (result1, result2, ... -> (combine the results)})

如果有依赖结果,则可以使用flatMap

代码语言:javascript
复制
single1.flatMap(result -> (generate a new Single based on that result)})
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49475625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档