当前位置: 首页 > 知识库问答 >
问题:

如何在Mvvm中取消视图模型中的api请求?

云浩然
2023-03-14

我正在尝试取消api请求,如果用户调用api来加快速度,那么只有最新的api才会返回结果,所有以前的请求都应该被丢弃,但这不起作用,任何人都知道解决方案,请帮助,谢谢

类CartViewModel(val store:Account):base viewmodel(){

私有var请求计算:作业?=空

fun重新计算(){

    requestCalculation.let {
        if (it != null) {
            if (it.isActive) {
                requestCalculation!!.cancel()
            }
        }
    }

    requestCalculation = viewModelScope.launch(Dispatchers.IO) {
        isLoading.postValue(true)
        try {
            val order = CCOrderManager.shared.calculateTaxesAndApplyRewards(store.id)
            refreshOrder()

        } catch (e: Exception) {
            exception.postValue(e.localizedMessage ?: e.toString())
        }
    }
}

}

共有2个答案

卞坚成
2023-03-14

在 api 调用 this.is 活动 {return@launch} 后添加一个检查,终于对我有用了...

fun recalculate() {
    calculationRequest?.cancel()
    isLoading.postValue(true)
    calculationRequest = viewModelScope.launch(Dispatchers.IO) {
        try {
            val order = 
           CCOrderManager.shared.calculateTaxesAndApplyRewards(store.id)
       // this check is the solution   *******             
       if (!this.isActive) {return@launch}
            val catalog = CatalogManager.shared().catalog
            
        } catch (e: Exception) {
           
        }
    }
}
涂羽
2023-03-14

取消和执行的顺序是错误的。当函数启动时,请求计算为 null,因此无法取消。确保首先启动协程,稍后再取消它。例如:

private var requestCalculation: Job? = null

fun recalculate() {

    requestCalculation = viewModelScope.launch(Dispatchers.IO) {
        delay(10_000)
        // do your work...
    }
    
    // now the job can be canceled
    requestCalculation?.cancel()
}
 类似资料:
  • 问题内容: 假设我有一个模型Car,该模型在 ViewModel1中 实例化为以下初始属性: ViewModel1 然后,我需要在下一个视图控制器中完成汽车的其他信息。遵循MVVM时,在视图控制器之间传递模型的 正确 方法是什么? 使用MVC,操作很简单,因为视图可以引用模型: 以下是对该问题的伪尝试,但是我给人的印象是视图模型应该是私有的,并且只能由单个视图控制器访问。因此,以下尝试对我来说似乎

  • 问题内容: 在AngularJS中给出Ajax请求 如果启动另一个请求(相同的后端,例如不同的参数),取消该请求的最有效方法是什么? 问题答案: 此功能通过超时参数添加到1.1.5版本中:

  • 问题内容: 我用于ajax请求,而+ 用于渲染UI。在我的应用程序中,有第三方时间轴(reactJS组件)。时间轴可以通过鼠标滚动进行管理。应用程序在发生任何滚动事件后发送对实际数据的ajax请求。问题是服务器上的请求处理可能比下一个滚动事件慢。在这种情况下,应用可能会有几个(通常是2-3个)请求已被弃用,因为用户会进一步滚动。这是一个问题,因为每次接收新数据时线都会开始重绘。(因为它是react

  • 我使用处理ajax请求,使用渲染UI。在我的应用程序中,有第三方时间线(reactJS组件)。时间线可以通过鼠标滚动来管理。在任何滚动事件之后,应用程序都会发送实际数据的ajax请求。问题是服务器上的请求处理可能比下一个滚动事件慢。在这种情况下,应用程序可能有几个(通常为2-3个)请求,由于用户进一步滚动,这些请求已经被弃用。这是一个问题,因为每次收到新数据时,时间线都开始重新绘制。(因为它是re

  • 问题内容: 使用angular时,在视图内获取对象的首选方法是什么? 看起来好像有这个项目,但是看起来维护得不好。 https://github.com/gdi2290/angular- momentjs 问题答案: 有一个更受欢迎的angular-moment项目… https://github.com/urish/angular- moment 有了它,您可以像这样注入瞬间… jsfiddle

  • 问题内容: 使用此代码: 如何取消请求并丢弃数据,否则,如何在onSuccess方法中识别请求(使用名称/向导/任何名称),以便我可以确定哪个请求已完成? 我正在考虑做一个array.push(pendingRequest)来跟踪挂起的请求 我想允许用户中断他们的请求,更改输入值并重新提交。 有时,原始请求会在新请求之后结束,而我会用“旧”数据替换“正确”数据。(例如,搜索结果在第一个查询中返回5