[英]Assign a variable to the result of a call inside a coroutine
有一個單行嗎?
...
var x = ""
coroutine.launch {
x = StoreHelper.getProductPrice(mdProducts[0].id)
}
return x
在這種情況下,您不應該依賴變量x
將具有與""
不同的值。 協程異步運行,因此x
可以在代碼StoreHelper.getProductPrice()
運行之前返回值""
。
您可以將代碼重寫為如下所示:
coroutine.launch {
val x = StoreHelper.getProductPrice(mdProducts[0].id)
// do smth with x
}
但在這種情況下,您不能從 function 返回x
。
據我所知,沒有任何一種方法可以做到這一點。
您可能想改用async
,它返回一個Deferred
return coroutine.async { StoreHelper.getProductPrice(mdProducts[0].id) }
稍后您可以在協程中await
結果 - 或者如果您想使用實驗性的getCompleted
function 並希望它完成,您可以這樣做。 雖然不是處理異步結果的最佳主意,但await
是您真正應該使用的。
請記住,這是異步代碼的全部問題 - 事情同時發生,有些事情比其他事情花費更長的時間,因此您需要一種方法來處理准備好的結果。 在你擁有它之前你不能返回x
,所以你要么需要阻塞直到協程完成,要么返回類似Deferred
的東西(就像 Java Future
)這樣你就可以參考正在運行的作業,你可以稍后檢查。 或者根本不返回結果,只是讓該工作完成后做一些事情,比如調用 function。
這部分關於異步函數的內容可能有助於通讀一遍,讓您了解您需要什么以及可以做什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.