2017-07-06 40 views
1

我使用Redux的循環寫一個非常簡單的應用程序,有3個要素:在週期js中動態更新源和接收器?

  1. 的文本字段輸入URL
  2. A 「連接」 按鈕連接到WebSocket終點
  3. 的輸出面板,顯示收到的消息

我已經寫在此基礎上回答https://stackoverflow.com/a/42926532/842860

了Wi一個非常簡單的WebSocket司機代碼是這樣的:

const cycleMiddleware = createCycleMiddleware(); 
const {makeActionDriver} = cycleMiddleware; 

function main(sources) { 
    return { 
     ACTION: sources.WEBSOCKET // The websocket driver emits commands which are consumed by reducers 
    } 
} 

const store = createStore(
    reducer, // Update redux state 
    applyMiddleware(cycleMiddleware) 
); 

run(main, { 
    WEBSOCKET: WSDriver("ws://localhost:3000/something"), // The initial connection string 
    ACTION: makeActionDriver() 
}); 

問題是如何使websocket重新連接到另一個端點時點擊連接按鈕?我是否需要修改我的websocket驅動程序來捕獲事件並重新連接,或者cyclejs是否提供動態更新源/接收器的方法?

回答

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$來來自屁股上的點擊事件上。

希望它有幫助