kotlin -мультиплатформа: как использовать Kotlin Поток в Javascript - PullRequest
3 голосов
/ 06 мая 2020

Я создал многоплатформенную библиотеку kotlin для разработки уровня домена, ориентированного на JVM и JS (nodejs и браузер). Домен зависит от UseCase, UseCase зависит от репозитория, репозиторий зависит от службы и базы данных. AFAIK, Kotlin Coroutines работают на разных платформах (JS / JVM / Native).

У меня есть функция, которая возвращает Flow вместо Promise.

fun getUserList() : Flow<List<User>>{...}

Причина в том, что я хочу обновить пользовательский интерфейс, как только в базе данных появятся какие-либо изменения. На JVM (или Android) я знаю, как использовать Flow. Но не понимаю, как использовать его из простого Javascript (или TypeScript) (а не Kotlin - JS). Даже я не нашел никакой вспомогательной статьи, объясняющей использование Flow для JS.

Может ли кто-нибудь мне с этим помочь? Приветствуется любая помощь!

PS: Мои Javascript Навыки промежуточные: P

1 Ответ

0 голосов
/ 06 мая 2020

Итак, пока я не найду какое-то официальное решение этой проблемы, вот что я придумал:

Вместо того, чтобы возвращать Flow, я создал функцию-оболочку, принимающую два аргумента:

@JsName("getUsersListWithUpdatesJs")
fun UserUseCase.getUsersListWithUpdatesJs(
    success: (List<User>) -> Unit,
    error: (Throwable) -> Unit
) = GlobalScope.promise {
    try {
        getUsersList().collect {
            success(it)
        }
    } catch (exception: Throwable) {
        error(exception)
    }
}

Затем я опубликовал библиотеку Js на нашем сервере Nexus.

Добавлен в качестве зависимости в проект JS с использованием npm.

Затем использование:

import * as domain from "my-multiplatform-library";
…
…
…
domain.com.abc.usecase.createUserUseCaseJs().then(
      (useCase) => {
        console.log(useCase);
        useCase. getUsersListWithUpdatesJs(
            (list) => {
                // This block should be called twice. For Empty and Non-empty array
                console.log("Response", list)
            },
            (error) => {
                // Ignore this block for now
            },
        );
      },
      (error) => {
        console.log(error);
      }
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...