我声明了更新功能:
update : Action -> Model -> (Model, Effects.Effects Action)
我的模特是:
model = Signal.foldp update init actions.signal
但Signal.foldp期望更新功能与Action - >型号 - >模型形状。
效果是POST调用代码:
Http.post Json.Decode.string "http://localhost/tracker/link-admin/test.php" body
|> Task.toMaybe
|> Task.map SetShortenedUrl
|> Effects.task
我有两个问题:
谢谢!
答案 0 :(得分:1)
如果您将在没有Effects
的情况下使用StartApp
,则在某些时候您需要使用Effects.toTask
,这需要一个可以接受操作列表的邮箱。
请注意documentation of Effects.toTask
除了专家手(完全披露:我不是专家)之外警告其明确使用,每个应用最多一次,但我要去无论如何,在这里选择它作为理解StartApp的练习。
使用StartApp
source code作为我们的指南,我们可以选择让您的示例运行所需的最低限度。首先,我们必须通过定义一个名为messages
的第二个邮箱来处理麻烦的邮箱问题,该邮箱会列出一系列操作。
messages =
Signal.mailbox []
现在,我们必须使用列表的第一个元素,仅使用列表中的第一个元素重定义actions
邮箱,如果是空列表,则必须重新定义messages
邮箱。 (阅读Effects.toTask
以了解它为什么是列表,以及为什么我们在这个例子中可以将其视为单例列表)
NoOp
我们需要一个新的信号来处理效果,这样我们就可以将actions : Signal.Mailbox Action
actions =
let
singleton action =
[action]
fromList list =
case list of
[] -> NoOp
(action::_) -> action
in
{ address = Signal.forwardTo messages.address singleton
, signal = Signal.map fromList messages.signal
}
函数中的处理从我们即将发送到端口的任务中分离出来。再次,从update
中选择片段,我们可以定义以下信号
StartApp
现在我们有了上面的effectsAndModel : Signal (Model, Effects.Effects Action)
effectsAndModel =
let
updateJustModel action (model,_) = update action model
in
Signal.foldp updateJustModel init actions.signal
信号,我们现在可以通过从元组的第一个元素中剥离模型来重新定义effectsAndModel
信号。
model
同样,我们可以使用model : Signal Model
model =
Signal.map fst effectsAndModel
信号通过从元组的第二个元素中剥离效果来将任务发送到端口:
effectsAndModel
上述端口port tasks : Signal (Task.Task Effects.Never ())
port tasks =
Signal.map (Effects.toTask messages.address << snd) effectsAndModel
是发生tasks
的地方,需要重新定义Effects.toTask
邮箱。
我使用临时actions
方法创建了一个简单的工作示例,以便在this gist验证您的要求。我将其更改为查找本地test.txt文件而不是您的网址。