如何从更新功能开始效果?

时间:2015-12-30 13:17:35

标签: elm

我声明了更新功能:

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

我有两个问题:

  1. 如何从更新中运行效果?
  2. 如何更改模型以进行类型检查?
  3. 谢谢!

1 个答案:

答案 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文件而不是您的网址。