对于榆木0.16,我刚刚定义了一些端口
(只是Signal
数据)没有主要功能和
使用Signal.map
来回处理数据。
它只适用于从nodejs调用的数据处理(不是来自浏览器),
所以我不依赖于Html
模块。
现在elm 0.17有Cmd
和Sub
而不是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 )
})
答案 0 :(得分:4)
<强>更新强>
现在有一个软件包可以让你创建一个worker。见lukewestby/worker
原始答案
通过创建Html.App程序,我得到了一个有效的例子。我无法找到导致程序包含main
函数和I'm not alone in that confusion的view
函数的要求。
我的示例是基于浏览器的,希望这适用于基于节点的版本;我之前没有使用过节点版本。
<强> 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>
几个小贴士:
update
函数内发送Cmd。Program
,唯一的方法(我能找到)就是包含[Html.App
]。我预感到,未来核心Router
类型可用于制作一个无头的#34;工作者,但似乎现在我们仍然需要Html.App程序并且必须渲染视图。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解释了如何将所有这些联系起来。