PromiseJavascript中的重要性和地位自不用说。由于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)
}