如何用榆木0.17创造工人

时间:2016-05-11 15:47:12

标签: node.js ports elm

对于榆木0.16,我刚刚定义了一些端口  (只是Signal数据)没有主要功能和 使用Signal.map来回处理数据。 它只适用于从nodejs调用的数据处理(不是来自浏览器),  所以我不依赖于Html模块。

现在elm 0.17有CmdSub而不是Signal, 我无法弄清楚如何做同样的事情......

任何人都可以给我一个最简单的例子来做数据 通过worker初始化公开的端口进行处理  榆树0.17?

这是我使用Elm 0.16的最简单的例子......

elm 0.16代码:

module Main where
import Signal
import String exposing (isEmpty, reverse)

-- input ports
port jsToElm : Signal String

-- output ports
port elmToJs : Signal String
port elmToJs
  = Signal.map String.reverse jsToElm

javascript(es6)代码:

/** main */
const Elm = loadElm('./index.js') // custom function to eval Elm code
const app = Elm.worker( Elm.Main, { jsToElm: ''})

app.ports.jsToElm.send('test')

app.ports.elmToJs.subscribe(( txt ) => {    
    console.log( txt )
})

2 个答案:

答案 0 :(得分:4)

<强>更新

现在有一个软件包可以让你创建一个worker。见lukewestby/worker

原始答案

通过创建Html.App程序,我得到了一个有效的例子。我无法找到导致程序包含main函数和I'm not alone in that confusionview函数的要求。

我的示例是基于浏览器的,希望这适用于基于节点的版本;我之前没有使用过节点版本。

<强> Main.elm

port module Main exposing (..)

import Json.Decode
import Json.Encode
import Html exposing (..)
import Html.App

import String exposing (isEmpty, reverse)

-- input ports
port jsToElm : (String -> msg) -> Sub msg

-- output ports
port elmToJs : String -> Cmd msg

type alias Flags = { jsToElm : String }

main =
  Html.App.programWithFlags
    { init = init
    , view = view
    , update = update
    , subscriptions = subscriptions
    }

type alias Model = { text : String }

init : Flags -> (Model, Cmd Msg)
init flags =
  (Model flags.jsToElm, Cmd.none)

type Msg
  = Reverse String

update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
  case msg of
    Reverse str ->
      let reversed = reverse str
      in ({ model | text = reversed }, elmToJs reversed)

view : Model -> Html.Html Msg
view model =
  text <| "text is: " ++ model.text

subscriptions : Model -> Sub Msg
subscriptions _ =
  jsToElm Reverse

<强>的index.html

<script type="text/javascript" src="Main.js"></script>
<script type="text/javascript">
var app = Elm.Main.fullscreen({
  jsToElm: 'first'
});

window.setTimeout(function() {
  app.ports.jsToElm.send('test');
}, 1);

app.ports.elmToJs.subscribe(function ( txt ) {    
    console.log( txt )
});
</script>

几个小贴士:

  1. 正如您所看到的,信号的简单映射已经消失,而且这个小例子还有更多的样板。我们的想法是您设置了对端口的订阅,然后在想要将信息发送回Javascript时在update函数内发送Cmd。
  2. 整个Cmd / Sub事物需要Program,唯一的方法(我能找到)就是包含[Html.App]。我预感到,未来核心Router类型可用于制作一个无头的#34;工作者,但似乎现在我们仍然需要Html.App程序并且必须渲染视图。
  3. 在javascript中将setTimeout发送到端口时,您会注意到"test"来电。我不确定为什么这个kludge是必要的但是others have seen it before as well

答案 1 :(得分:1)

upgrade guide进入了这个问题,但我将在此总结一下您对代码的引用:

输入端口:

-- 0.16
port jsToElm : Signal String

-- 0.17
port jsToElm : (String -> msg) -> Sub msg

输出端口:

-- 0.16
port elmToJs : Signal String

-- 0.17
port elmToJs : String -> Cmd msg

new Elm guide解释了如何将所有这些联系起来。