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
。
答案 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