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)
}