我试图用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
在后台线程上运行时才会起作用(它确实如此),但仍然感觉像是黑客。
有更好的方法吗?
答案 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
}