Цепочные обещания, возвращающие функции в Kovenant

Я пытаюсь связать 2 обещание вернуть функции с Kovenant, например:

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

Кажется, что then в Kovenant возвращается значение как есть. Как получить фактическое целое число от promiseFunc2 ? Единственное решение, которое я получил, это использовать функцию get() , например:

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

Однако, поскольку get() блокирует поток, он работает только then когда then работает на фоновом потоке (что он делает), тем не менее, он похож на хак.

Есть ли способ лучше?

Вы получаете Promise<Promise<Int, Exception>, Exception> когда вы возвращаете другое обещание от переданной then лямбды. Поэтому в следующем then аргумент имеет тип 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() часто появляется в вашем коде, вы можете использовать его сокращенное bind из kovenant-functional :

 promiseFunc1() bind { it: Int -> promiseFunc2() } then { it: Int -> // it is now an integer } 
Intereting Posts
Как получить делегированный экземпляр в Котлин? Разрешены только безопасные (?.) Или непустые (!!.) Вызовы на приемнике с нулевым значением Список несоответствий типа Kotlin <Any> и List <Comparable <{com.cognitect.transit.Symbol & com.cognitect.transit.Keyword}>?> Как «Список <MyClass> :: clas.java` в kotlin Получить случайный элемент из списка с использованием потоков kotlin Ярлык IntelliJ для конфигурации запуска Соответствующие имена параметра в реализованных / переопределенных методах Являются ли coroutines просто синтаксическим сахаром вокруг обработчиков завершения? как реализовать java-интерфейс SAM в Котлине? Как проверить видимость программной клавиатуры в Android? Mockito ArgumentCaptor для функции Kotlin Kotlin: передать объект в качестве ссылки и изменить его экземпляр Как использовать код, который опирается на ThreadLocal с сопрограммами Kotlin Kotlin: получить суперкласс из объекта класса – ошибка вывода объекта Расширение класса с множеством параметров