簡體   English   中英

將變量分配給協程內的調用結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM