在周期js中动态更新源和接收器?

时间:2017-07-06 11:29:13

标签: redux cyclejs

我正在使用redux-cycle编写一个非常简单的应用程序,包含3个元素:

  1. 输入网址的文字字段
  2. 用于连接websocket终点的“连接”按钮
  3. 显示传入消息的输出面板
  4. 我根据这个答案编写了一个非常简单的websocket驱动程序https://stackoverflow.com/a/42926532/842860

    接线代码如下:

    function TextBoxChange()
    {
    var textboxValue=$("input[name=bg]").val();
    var pattern=/https?:\/\/.*\.(?:png|jpg|gif)/i;
    //alert(/https?:\/\/.*\.(?:png|jpg|gif)/i.test(textboxValue));
    if(pattern.test(textboxValue))
    {
    $("#errorMsg").text("valid");
    }
    else
    {
    $("#errorMsg").text("invalid");
    }
    }

    问题是如何在单击连接按钮时使websocket重新连接到另一个端点?我是否需要修改我的websocket驱动程序以捕获事件并重新连接,或者cyclejs是否提供了动态更新源/接收器的方法?

1 个答案:

答案 0 :(得分:2)

我认为合适的方法是确实更新WSDriver以获取sink$作为输入。此sink$可能包含您要连接的网址。

你的司机看起来像这样

function WSDriver(endpoint$) {
  var activeConnection;
  return endpoint$
    .map(endpointUrl => xs.create({
      start: listener => {
       activeConnection = new WebSocket('ws://localhost:4000');
       /* no change here */
      },
      stop: () => {
        activeConnection.close();
      }
    }))
    .flatten() // it's a stream of stream, so we need to flatten it
}

app方面,您需要更改此

run(main, {
    WEBSOCKET: WSDriver(), // < no initial connection
    ACTION: makeActionDriver()
});

main

function main(sources) {
    return {
        ACTION: sources.WEBSOCKET,
        WEBSOCKET: newConnection$.startWith("ws://localhost:3000/something")
    }
}

鉴于newConnection$来自按钮上的点击事件。

希望有所帮助