如何使用协程在 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")
}
我最近开始使用协程。
任务是我需要检查列表中的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")
}