链接承诺在Kovenant中返回功能

时间:2017-03-05 14:29:34

标签: kotlin kovenant

我试图用Kovenant链接2个承诺返回函数,如下:

fun promiseFunc1() : Promise<Int, Exception> {
    return Promise.of(1)
}

fun promiseFunc2() : Promise<Int, Exception> {
    return Promise.of(2)
}

fun promiseCaller() {
    promiseFunc1() then { it: Int ->
        promiseFunc2()
    } then { it: Int ->
        // Compilation error: it is not not an integer
    }
}

似乎Kovenant中的then按原样返回值。如何从promiseFunc2获取实际整数?我得到的唯一解决方案是使用get()函数,如下所示:

    promiseFunc1() then { it: Int ->
        promiseFunc2().get()
    } then { it: Int ->
        // it is now an integer
    }

但是,由于get()阻止了线程,只有then在后​​台线程上运行时才会起作用(它确实如此),但仍然感觉像是黑客。

有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

当你从传递给Promise<Promise<Int, Exception>, Exception>的lambda返回另一个promise时,你得到then类型。因此,在下一个then中,参数it的类型为Promise<Int,...>,而不是Int

为了展平承诺,您可以使用unwrap功能,将Promise<Promise<V>>转换为Promise<V>。然后你的例子看起来像:

promiseFunc1().then { it: Int ->
   promiseFunc2()
}.unwrap()
.then { it: Int ->
   // it is now an integer
}

如果您的代码中经常出现then {}.unwrap()的组合,则可以使用kovenant-functional中的简写bind

promiseFunc1() bind { it: Int ->
   promiseFunc2()
} then { it: Int ->
   // it is now an integer
}