Promise
在Javascript
中的重要性和地位自不用说。由于Kotlin
支持高阶函数,所以将Promise
的思想引入Kotlin
来实现链式调用,解决嵌套回调不失为一个好的选择。
Kotlin
没有Promise
的官方实现,因此这里参考ES6
的定义,自己实现了一个,源码在这里promise4k。
依赖
通过Gradle
可以很方便的添加依赖:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
compile 'com.github.enzowyf:promise4k:1.0.0'
}
语法
Promise
的基本语法请参考 Using promises。
构造函数
val promise = Promise { resolve, reject ->
setTimeout({
resolve("foo")
}, 1000)
}
resolve用法
Promise.resolve("foo").then { value ->
println("Get some data:$value")
}
reject用法
Promise.reject("foo").catch { reason ->
println("Something wrong:$reason")
}
then用法
Promise.resolve("foo").then { value ->
println("Get some data:$value")
}
或者
Promise.resolve("foo")
.then({ value ->
println("Get some data:$value")
}, { reason ->
println("Something wrong:$reason")
})
catch用法
Promise.resolve("foo")
.then { value ->
println("Get some data:$value")
}.catch { reason ->
println("Something wrong:$reason")
}
all用法
Promise.all(listOf(promise1, promise2, promise3)).then {
println("All finish:$it")
}
race用法
Promise.race(listOf(promise1, promise2, promise3)).then {
println("Race winner:$it")
}
链式调用
val p1 = Promise.resolve("foo")
val p2 = Promise.resolve("bar")
p1.then {
println(it)
p2
}.then {
println(it)
"Hello"
}.then {
println(it)
Promise.reject("Oh, no!")
}.catch {
println(it)
"Claim down"
}.then {
println(it)
throw Exception("Oh, my God!!!")
}.catch {
println((it as? Exception)?.message)
}