如何使用协程在 forEach 中等待服务器的响应

How to Wait response from Server in forEach with Coroutines

我最近开始使用协程。

任务是我需要检查列表中的priority参数并向服务器发送request,如果服务器的响应正常,则停止循环。

var minPriority = 0
list.forEach { model -> 
   if (model.priority > minPriority) {
       makeRequest(model.value)
       minPriority = model.priority
   }
}

private fun makeRequest(value: String) {
    scope.launch() {
        val response = restApi.makeRequest()
        if response.equals("OK") {
            **stop list foreach()**
        }
    }
}

在 RxJava 中,这是使用 retryWhen() 运算符完成的,请告诉我如何在 Coroutines 中实现它?

我建议让您的整个代码都可以挂起,而不仅仅是 makeRequest() 函数的主体。通过这种方式,您可以 运行 在后台进行整个操作,但在内部它将是顺序的,这样更容易编码和维护。

可能是这样的:

scope.launch() {
    var minPriority = 0
    list.forEach { model ->
        if (model.priority > minPriority) {
            val response = restApi.makeRequest()
            if response.equals("OK") {
                return@forEach
            }
            minPriority = model.priority
        }
    }
}

如果您需要将 makeRequest() 功能分开:

fun myFunction() {
    scope.launch() {
        var minPriority = 0
        list.forEach { model ->
            if (model.priority > minPriority) {
                if (makeRequest(model.value)) {
                    return@forEach
                }
                minPriority = model.priority
            }
        }
    }
}

private suspend fun makeRequest(value: String): Boolean {
    val response = restApi.makeRequest()
    return response.equals("OK")
}