kotlin流式请求的一些思考

我项目中依赖的框架的mvvmlin 一个小型的协程+kotlin+livedata+rxjava的框架,原连接如下。
项目地址:MVVMLin
kotlin中文官网的地址
https://www.kotlincn.net/docs/reference/coroutines/coroutines-guide.html
项目中有如下需求,购物车先进行勾选,后台记忆选中,然后计算价格,最后拿取优惠活动.前后三个接口可能代码如下

fun orderPre(skuList: List) {
    launchOnlyresult({
        ApiNetWork.getInstance().orderPre(
            OrderPreBean()
    }, {//success
        getSendGoodsData()//继续调用接口 获取赠品
    })
}

然后

fun getSendGoodsData() {
    launchOnlyresult(
        {
            ApiNetWork.getInstance().getSendGoodsList(
          )
        },
        {//success 用liveda回调
            sendGoodsData.value = it
        })
}

这还只处理成功的情况 如果erro需要再次处理 可能会更麻烦,就像实现流式请求,mvvmlin的流式请求如下

/**
* 当一个请求结果,依赖另一个请求结果的时候,我们可以用 流的方式如下:
* 以此类推,还可以 用 zip 操作符 对多个请求进行合并,以及 flatMapMerge、flatMapConcat 等。
* 熟悉 RxJava 的你,分分钟钟可以上手的 (斜眼笑 -
*/

@ExperimentalCoroutinesApi
@FlowPreview
fun getFirstData() {
    launchUI {
        launchFlow { homeRepository.getNaviJson() }
            .flatMapConcat {
                return@flatMapConcat if (it.isSuccess()) {
                    navData.addAll(it.data)
                    it.data.forEach { item -> navTitle.add(item.name) }
                    launchFlow { homeRepository.getProjectList(page, it.data[0].id) }
                } else throw ResponseThrowable(it.errorCode, it.errorMsg)
            }
            .onStart { defUI.showDialog.postValue(null) }
            .flowOn(Dispatchers.IO)
            .onCompletion { defUI.dismissDialog.call() }
            .catch {
                // 错误处理
                val err = ExceptionHandle.handleException(it)
                LogUtils.d("${err.code}: ${err.errMsg}")
            }
            .collect {
                if (it.isSuccess()) items.addAll(it.data.datas)
            }
    }

}

是放在了一起 更像rxjava 但是写着并不顺手,而且感觉也不好阅读,所以就看到了kotlin协程 async

suspend fun getdata1() {
val result = GlobalScope.async(start = CoroutineStart.LAZY) {//只有调用await的时候才会启动
ApiNetWork.getInstance().getSendGoodsList()
}

    LogUtils.e("----1" + result.await().msg)
    if (result.await().isSuccess()) {
        val result1 = GlobalScope.async(start = CoroutineStart.LAZY) {
            ApiNetWork.getInstance().getCouponDetail()
        }
        LogUtils.e("----2" + result1.await().msg)
    } else {
        ToastUtils.showShort(result.await().msg())

    }

}

}

这样的话 可能没有第二种方式优雅,但是我感觉逻辑却更清晰一点

你可能感兴趣的:(kotlin流式请求的一些思考)