json - 我可以将回调函数包装到另一个函数中以从中返回值吗?
问题描述
我有一个服务器请求(我正在使用 VK SDK)。所以我想把所有的东西都移到一个不同的地方,然后调用它并得到回复。这是我现在拥有的:
object GetAlbumsService {
fun getAlbums():GetAlbumsResponse{
lateinit var responseObject: GetAlbumsResponse
val request = VKRequest("photos.getAlbums", VKParameters.from("need_system", "1"))
request.executeWithListener(object: VKRequest.VKRequestListener(){
override fun onComplete(response: VKResponse?) {
responseObject = Gson().fromJson(response?.json.toString(), GetAlbumsResponse::class.java)
}
})
return responseObject
}
}
但是 responseObject 仍然存在null
。我对那个onComplete
功能没有时间填充responseObject
吗?如果是这样,我该怎么办?
解决方案
您不能从启动后台工作的函数返回异步回调的结果。但是您可以允许调用函数传递回调。
fun getAlbums(onComplete: (GetAlbumsResponse) -> Unit) {
val request = VKRequest("photos.getAlbums", VKParameters.from("need_system", "1"))
request.executeWithListener(object: VKRequest.VKRequestListener(){
override fun onComplete(response: VKResponse?) {
responseObject = Gson().fromJson(response?.json.toString(), GetAlbumsResponse::class.java)
onComplete(responseObject)
}
})
}
然后从你称之为:
GetAlbumsService.getAlbums { response ->
// Do something with response
}
当结果准备好时,将调用 lambda 中的代码。
您也可以考虑使用协程,但是在这里的答案中从头开始解释太多了。
推荐阅读
- c# - 将 ML.NET 的 CreatePredictionEngine 与发出的类型一起使用
- python - 在列表中查找匹配的项目序列
- r - 如何在不缩小r闪亮中的矩阵大小的情况下向输入矩阵添加列?
- html - 如何在 ASP .NET Core Web 应用程序中为不同视图创建不同的背景图像
- php - 每次我使用 php 添加更多表时,顶部都有不需要的空间
- airflow - 如何设置默认的 dag 触发器配置 json
- ruby-on-rails - 升级到 Ruby 3.0 后应用程序(rails 6.1.1)无法启动
- apache-spark - TigerGraph - 通过 Spark 将数据加载到用户定义的元组
- java - Spring Cloud Configuration Server 不使用本地属性文件 - 需要使用复合配置
- spring-boot - 调用 init 方法失败;嵌套异常是 java.lang.IllegalArgumentException: Not a managed type