&引用;“输入未定义”;在Elm中使用WebSocket时出错

&引用;“输入未定义”;在Elm中使用WebSocket时出错,websocket,elm,Websocket,Elm,我试图在Elm中使用WebSockets建立一个简单的示例,但是我不断得到运行时错误“input is undefined”。控制台在elm文件中没有给我任何行号或类似的东西 我曾试图在一个大型项目中使用WebSocket,但不断出现错误“a未定义”,因此我决定制作这个小示例来尝试隔离问题 我编写了一些代码,从websocket接收包含数字的消息。它增加数字,然后通过web套接字将新数字发送回。服务器执行相同的操作,将递增1的数字发送回客户端 以下是elm代码: import Graphics.

我试图在Elm中使用WebSockets建立一个简单的示例,但是我不断得到运行时错误“input is undefined”。控制台在elm文件中没有给我任何行号或类似的东西

我曾试图在一个大型项目中使用WebSocket,但不断出现错误“a未定义”,因此我决定制作这个小示例来尝试隔离问题

我编写了一些代码,从websocket接收包含数字的消息。它增加数字,然后通过web套接字将新数字发送回。服务器执行相同的操作,将递增1的数字发送回客户端

以下是elm代码:

import Graphics.Element (Element)
import Signal
import Signal (Signal)
import Text
import Window
import WebSocket
import String

type State = Num Int
           | StateErr String

input : Signal String
input =
    WebSocket.connect "ws://localhost:4567/test" sendToServer

sendToServer : Signal String
sendToServer =
    Signal.dropRepeats
        (Signal.dropIf (\str -> str == "") "" (Signal.map formatReply state))

formatReply : State -> String
formatReply state =
    case state of
        Num n -> toString n
        StateErr str -> ""


stepState : String -> State -> State
stepState str state =
    case (String.toInt str) of
        Ok n -> Num (n + 1)
        Err str -> StateErr str


display : (Int,Int) -> State -> Element
display (w,h) state = Text.asText state


state : Signal State
state =
    Signal.foldp stepState (Num 0) input


main : Signal Element
main =
    Signal.map2 display Window.dimensions state
我测试了服务器端,它工作得很好,所以我绝对不认为是服务器造成了问题

当我在Firefox中尝试代码时,我得到了“输入未定义”。当我在Chrome中运行它时,我得到“无法读取未定义的属性‘kids’”。 在Chrome中,查看堆栈跟踪时,似乎代码运行时,输入未定义。这是WebSocket库的错误吗


我对使用Elm非常陌生,因此我非常感谢任何关于使用websockets的帮助/建议。

我了解到我遇到问题的原因是,到目前为止,Elm中的websockets库尚未完全实现。我还了解到,我可以使用端口实现我的目标,然后用javascript实现websocket

我将以下javascript添加到我的html文件中:

var game = Elm.fullscreen(Elm.SlimeWarz, {rawServerInput: ""});
var socket = new WebSocket("ws://localhost:4567");

socket.onopen = function(){
  console.log("Socket has been opened.");
}

socket.onmessage = function(msg){
  game.ports.rawServerInput.send(msg.data);
}

game.ports.sendToServer.subscribe(sendOverWebsocket);

function sendOverWebsocket(str) {
  socket.send(str);
}
然后在elm中,我可以使用名为sendtoServer的移植信号发送数据

port sendToServer : Signal String
我可以查看通过端口信号rawServerInput接收到的所有数据

port rawServerInput : Signal String
答复 我要用一部分我认为在JavaScript中使用端口和websocket部分比我在回答中描述的hack更好,但是您可能仍然想看看它。Elm 0.15发布后,由于语言功能和
Websocket
的改进(
Http
也得到了改进),这个问题应该会完全消失

上下文:错误的原因 出现运行时错误的原因是由于。编译器只在递归函数上生成正确的代码,而接受任何递归值。请注意,您的
输入取决于
sendToServer
sendToServer
取决于
状态
sContext:tate
取决于
输入

上下文:代码体系结构
这些类型的循环信号通常是坏程序架构的标志。你可以找到关于这个问题的更多信息但是您的体系结构在这里没有问题。问题在于
Websocket
库没有将您引导到正确的方向

您最初的问题不一定与websocket相关。今天晚些时候或明天,我会尽量抽出时间给出完整的答案。谢谢你提供的更多信息!