我有此功能,效果很好。
inline fun <reified T:Any>String.parse() : T {
return GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create().fromJson<T>(this, T::class.java)
}
fun request (callback: (MyClass)->Unit) {
val url = URL("someurl").readText()
val myObject : MyClass = str.parse()
callback(myObject)
}
net.request {
it.myFunction()
println (it.myString)
}
myObject
自动填充了MyClass类型的对象,并正确返回到回调。
现在,我想捕获错误,并且让回调函数也可以返回该错误。
fun request (callback: (MyClass?, Exception?)->Unit) {
try {
val url = URL("someurl").readText()
val myObject : MyClass = str.parse()
callback(myObject, null)
}
catch (e: Exception) {
callback(null, e)
}
}
net.request { response, error ->
if (response != null ) { // do something }
else { // report something }
}
但是这很丑陋,因为无论如何,我将不得不强制回调始终具有两个参数,但是一次只存在一个。所以我在寻找可选的回调方法。我希望能够这样调用方法:
net.request {
onSuccess { response -> // do something }
onError { error -> // report something }
}
或者可能:
net.request
.onSuccess { response -> // do something }
.onError { error -> // report something }
如果我不想处理该错误,我只需拨打一个电话:
net.request {
onSuccess { // do something with 'it' }
}
我在互联网上可以找到的是覆盖现有的回调方法,例如this。这不是我想要的。我想从头开始编写该回调。查看源代码有时也无济于事,因为代码是Java的,而且我也不了解Java。还没有。
我了解Kotlin中的主要库(例如翻新或JavaRx)可能已经实现了类似的功能,但是我只是想知道执行此操作所需的最少代码,因为这是我的学习方法。我只是找不到正确的教程。
答案 0 :(得分:0)
您可以尝试library。它有助于简洁地建模成功/失败操作。然后,您的回调可以将MyClass
或Result<MyClass, Exception>
这样包装的Result
对象作为对象。
要将值传递给回调,请先执行Callback(Result.of(MyClass))
才能成功执行操作,如果失败则执行Callback(Result.of(Exception()))
。
然后您可以使用以下任何功能来使用回调
//if successful
result.success {
}
//if failed
result.failure {
}
//fold is there, if you want to handle both success and failure
result.fold({ value ->
//do something with value
}, { error ->
//do something with error
})
希望这会有所帮助:)
编辑:如@ user2340612所指出,Result
已添加到Kotlin stdlib中。有关更多详细信息,请参见here