在服務器發送成功狀態之前,我需要進行 api 呼叫。請求必須延遲兩秒執行,所有這些都必須在 10 秒過去后完成。
這是我的嘗試:
suspend fun loadData(): Data {
try {
withTimeout(10000) {
val data = repository.getData()
if (data.status == "SUCCESS") {
// complete
} else {
delay(1000)
// and after delay I need again call repository.getData(), until the status is SUCCESS
}
}
} catch (e: Exception) {
// complete
}
}
但我不明白如何回圈執行請求,在我看來我的代碼有問題。也許有更簡潔的方法,請幫助我。
uj5u.com熱心網友回復:
我相信您可以while為此使用一個簡單的回圈:
suspend fun loadData(): Data? {
return try {
withTimeout(10000) {
var data = repository.getData()
while (data.status != "SUCCESS") {
delay(1000)
data = repository.getData()
}
return@withTimeout data
}
} catch (e: Exception) {
null
}
}
uj5u.com熱心網友回復:
使用流的替代解決方案。我認為這樣做更簡潔,同時能夠處理getData()在繼續重試時拋出的例外。在您的原始代碼中,看起來您將在第一次拋出例外時放棄,getData()而不是繼續每 1000 毫秒重試一次。
回傳型別必須可以為空,以處理未及時檢索到的情況。
suspend fun loadData(): Data? {
return withTimeoutOrNull(10000) {
flow {
while(true) {
emit(repository.getData())
delay(1000)
}
}
.retry { delay(1000) }
.first { it.status == "SUCCESS" }
}
}
uj5u.com熱心網友回復:
這是我沒有回圈repeatWhen的方法:flowwhile
suspend fun loadData(): Data? {
return withTimeout(10000) {
flow {
val result = repository.getData()
if (result.status == "SUCCESS") {
emit(result)
} else throw ServerException()
}.retryWhen { cause, _ ->
if (cause is ServerException) {
delay(1000)
true
} else false
}.singleOrNull()
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/516532.html
上一篇:制作陣列來保存多型泛型
