我正在做一个小应用程序,该应用程序在Bittrex交易所跟踪加密货币值。
为此,我正在使用Bittrex的公共api(https://bittrex.github.io/api/v3) 不幸的是,该api不能仅通过一次调用就提供我想要的数据,因此我需要进行两次api调用。
我想要实现的是让一个对象包含以下所有值:
粗体变量是一个api调用的一部分,其他值是另一个api的一部分。 “符号”是两者的一部分。
我使用的是kotlin协程,我希望我不必使用RxJava之类的东西就可以正常工作。
CoroutineScope(IO).launch {
val tickers = async {
api.getTickers()
}.await()
val markets = async {
api.getMarkets()
}.await()
val result = mutableListOf<Market>()
for (ticker in tickers.data) {
for (market in markets.data) {
if (ticker.symbol == market.symbol) {
result.add(
Market(
ticker.symbol,
ticker.lastTradeRate,
market.quoteVolume,
market.percentChange
)
)
}
}
}
}
答案 0 :(得分:1)
您可以使用协同程序并行进行两个调用。
假设firstApi
和secondApi
是暂挂函数,它们分别返回您需要的2个信息块的数据,
val data1Deferred = async { firstApi() }
val data2Deferred = async { secondApi() }
val data1 = data1Deferred.await()
val data2 = data2Deferred.await()
val result = Result(
// build result from data1 and data2
)
您还需要添加错误处理。
编辑:
您可以按符号将列表分组并生成地图:
val marketMap = markets.associateBy { it.symbol }
然后为每个股票提供相应的市场
for (ticker in tickers) {
val market = marketMap[ticker.symbol]
if (market != null) {
// join ticker and market
}
}