2016-05-11 59 views
3

對於榆樹0.16工作者,我只是定義了一些端口 (即僅僅是數據的Signal),而主要功能和使用 Signal.map處理數據來回。 它只是從nodejs(不是來自瀏覽器)調用的數據處理, ,所以我不依賴於Html模塊。如何創建與榆樹0.17

現在榆樹0.17有CmdSub代替Signal, 我無法弄清楚如何做同樣的...

任何人都可以給我通過由worker初始化暴露的端口進行數據 處理一個簡單的例子 與榆樹0.17?


這是我用榆木0.16 ...

榆樹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) 
}) 

回答

4

更新

現在有一個包,讓您能夠創建工作的能力。見lukewestby/worker

原來的答案

我能夠通過創建Html.App程序獲得工作的例子。我找不到任何可以導致包含view函數和I'm not alone in that confusion的程序的main函數。

我的例子是基於瀏覽器的,希望這適合您的基於節點的版本;我以前沒有使用節點版本。

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 

索引。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. 正如你所看到的,信號的簡單的映射不見了,有這樣一個小例子更樣板。這個想法是,你設置你的端口訂閱,然後發送一個Cmd在update函數內,當你想發送信息回到Javascript。
  2. 這整個cmd/sub的東西需要一個Program和唯一的方法來做到這一點(我可以找到)是包括[Html.App]。我有一種預感,將來可以使用核心Router類型來創建一個「無頭」工作者,但是現在看來我們堅持要求Html.App程序並且必須呈現一個視圖。
  3. 在發送"test"到javascript中的端口時,您會注意到setTimeout呼叫。我不知道爲什麼是雜牌必要的,但others have seen it before as well
+0

謝謝你的幫助。看到我們現在不得不使用醜陋的工作,這是很可悲的。我希望它會得到修復。再次感謝。 – Tosh

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解釋到底如何把所有這一切都掛上鉤。

+0

如何連接輸入端口到輸出端口(在榆樹0.16,我用'Signal.map'直接連接它們)?遷移指南中給出的示例使用'Html.App',這是我沒有或不需要的。 – Tosh

+0

@Tosh:老實說,我不確定。沒有使用'Html.App'的人的文檔在新的指南中看起來很奇怪。 –

+1

無論如何非常感謝您的更新...至少,我知道我不是唯一一個在Html.App使用之外找不到信息的人。我會等待其他建議。 – Tosh