如何链接端口呼叫?

时间:2020-02-07 21:08:22

标签: port elm

port createNewDocument: Encode.Value -> Cmd msg 
port printDocument : () -> Cmd msg
createNewDocument: Document -> Task err msg
printDocument: Task err msg

我想一步一步将这createprint步骤链接起来。因为有时候我需要一个接一个,所以有时我需要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 个答案:

答案 0 :(得分:3)

如果不引入中间的信息,则无法做到这一点。端口也仅是单向的,因此您需要一个订阅端口才能从外部源返回值。

即,您的第一个命令触发了一个JavaScript函数,该函数通过订阅发送消息,而在fruitType$ = combineLatest([this.entity$, this.datasetStateService.get$('Fruits')]) .pipe(map(data => { const entity = data[0]; const dataset = data[1]; return { isApple: (dataset.find(ds => ds.label === 'Apple') as DataItem).id === entity.fruitId, isOrange: (dataset.find(ds => ds.label === 'Orange') as DataItem).id === entity.fruitId } })); 函数中,您通过返回第二个命令来处理该消息。

update