2016-05-11 14 views
3

Für 0,16 Ulme erstellen, I definierte nur einige Ports ohne Hauptfunktion (die nur Signal von Daten) und verwendeten Signal.map Daten hin und her zu verarbeiten. Es ist nur für die Datenverarbeitung von Nodejs (nicht vom Browser), aufgerufen, so dass ich nicht auf Html Modul angewiesen bin.Wie Arbeiter mit Ulme 0,17

Jetzt Ulme 0,17 hat Cmd und Sub statt Signal, ich kann nicht herausfinden, wie das gleiche zu tun ...

Kann jemand geben Sie mir eine einfachste Beispiel Daten von worker Initialisierung ausgesetzt Verarbeitung über die Ports zu tun mit Ulme 0,17?


Hier ist meine einfachste Beispiel mit Elm 0,16 ...

Ulme 0,16 Code:

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) Code:

/** 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) 
}) 

Antwort

4

aktualisieren

Es gibt jetzt ein Paket, das Ihnen die Möglichkeit, einen Arbeiter zu schaffen gibt. Siehe lukewestby/worker

Original-Antwort

konnte ich ein funktionierendes Beispiel erhalten, indem ein Html.App Programm zu schaffen. Ich kann keinen Weg finden, um eine main Funktion zu haben, die zu einem Programm führt, das eine view Funktion und I'm not alone in that confusion enthält.

Mein Beispiel hier ist Browser-basiert, hoffentlich passt das wieder in Ihre node-basierte Version; Ich habe die Knotenversion vorher noch nicht benutzt.

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> 

Ein paar Imbissbuden:

  1. Wie Sie, die einfache Zuordnung von Signalen zu sehen ist weg und es gibt viel mehr vorformulierten für so ein kleines Beispiel. Die Idee ist, dass Sie Ihr Abonnement für den Port einrichten und dann einen Cmd innerhalb der update-Funktion senden, wenn Sie Informationen zurück an Javascript senden möchten.
  2. Diese ganze Cmd/Sub-Sache erfordert eine Program und die einzige Möglichkeit (die ich finden könnte) war, [Html.App] einzuschließen. Ich habe eine Ahnung, dass in der Zukunft der Kern Router Typ verwendet werden kann, um einen "kopflosen" Arbeiter zu machen, aber es scheint, als ob wir jetzt stecken bleiben mit der Html.App-Programm und müssen eine Ansicht rendern.
  3. Sie werden die setTimeout Anruf beim Senden von "test" an den Port in Javascript bemerken. Ich bin mir nicht sicher, warum diese Flickschusterei notwendig ist, aber others have seen it before as well
+0

Danke für die Hilfe. Es ist traurig zu sehen, dass wir jetzt die hässliche Arbeit nutzen müssen. Ich hoffe, dass es behoben wird. Danke noch einmal. – Tosh

1

Die upgrade guide geht in diesem, aber ich werde hier zusammenfassen mit Verweisen auf Ihren Code:

Input Port:

-- 0.16 
port jsToElm : Signal String 

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

Output Port:

-- 0.16 
port elmToJs : Signal String 

-- 0.17 
port elmToJs : String -> Cmd msg 

Die new Elm guide erklärt genau wie man das alles anhakt.

+0

Wie verbinde ich Eingangs-Port in dem Ausgangsanschluss (in Elm 0,16, verwende ich 'Signal.map' sie direkt zu verbinden)? Das Beispiel im Migrationsleitfaden verwendet 'Html.App', das ich nicht habe oder brauche. – Tosh

+0

@ Tosh: Ehrlich gesagt bin ich mir nicht sicher. Die Dokumentation für Leute, die 'Html.App' nicht verwenden, scheint in dem neuen Handbuch wirklich seltsam begrenzt zu sein. –

+1

Vielen Dank für das Update trotzdem ... Zumindest weiß ich, dass ich nicht der einzige bin, der keine Informationen außerhalb von 'Html.App' finden kann. Ich warte auf andere Vorschläge. – Tosh