Как связать портовые звонки? - PullRequest
0 голосов
/ 08 февраля 2020
port createNewDocument: Encode.Value -> Cmd msg 
port printDocument : () -> Cmd msg
createNewDocument: Document -> Task err msg
printDocument: Task err msg

Я хочу объединить эти create и print шаги в один шаг. Потому что иногда мне нужно оба по порядку - иногда мне нужно create the document - сделать some updates, затем print.

someCmd: Cmd msg
someCmd = createNewDocument |> Task.andThen (\ what? -> -- what to add here? printDocument ) |> Task.attempt (\ result -> some result handler )

как я могу связать port звонки? Поскольку порты возвращают Cmd msg, а не Task err msg.

1 Ответ

3 голосов
/ 08 февраля 2020

Нет способа сделать это без представления сообщения, которое живет посередине. Порты также являются только однонаправленными, поэтому вам потребуется порт подписки для возврата значения из внешнего источника.

Т.е.: ваша первая команда вызывает функцию JavaScript, которая отправляет сообщение через подписку, и в вашем update Функция, с которой вы обрабатываете это сообщение, возвращая вторую команду.

type Msg
    = ...
    | CreateNewDocument Encode.Value
    | PrintDocument Document

update : Msg -> Model -> (Model, Cmd.model)
update msg model =
    case msg of 
        ...

        CreateNewDocument value ->
            (model, createNewDocument value)

        PrintDocument document -> 
            (model, printDocument document)

sub : Sub Msg
sub = 
   receiveNewDocument PrintDocument
...