Нет способа сделать это без представления сообщения, которое живет посередине. Порты также являются только однонаправленными, поэтому вам потребуется порт подписки для возврата значения из внешнего источника.
Т.е.: ваша первая команда вызывает функцию 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