reactjs - Redux-Saga 套接字
问题描述
我通过 Redax-saga 连接套接字。当我打开套接字时,我可以订阅我需要的频道,但是当我需要订阅其他内容时,我会关闭并重新打开套接字。我可以以某种方式发送数据以订阅此套接字吗?
const ws = () => `ws://localhost:8980/?_admin1`;
export const openTradeSocket = createRoutine('TRADE_SOCKET_OPEN');
export const closeTradeSocket = createRoutine('TRADE_SOCKET_CLOSE');
function tradeSocket(payload) {
return eventChannel(emit => {
const socket = new WebSocket(ws(payload.userId || ''), ['wamp']);
socket.onopen = () => {
if (payload.chat) {socket.send(JSON.stringify([5, `chat:en`]));}
else {socket.send(JSON.stringify([5, `trades:${payload.contract}`]));}
};
socket.onerror = error => socket.close();
socket.onclose = () => {};
socket.onmessage = ({ data }) => {
try {
emit(JSON.parse(data));
} catch (e) {
}
};
return () => {
socket.close();
};
});
}
function* tradeWatcher(channel) {
while (true) {
const data = yield take(channel);
if (data[2].data) {
switch (data[1].split(':')[0]) {
case 'contracts':
yield put(updatePricelist(data[2].data));
break;
}
}
}
}
export function* handleTradeChannel() {
while (true) {
const { payload } = yield take(openTradeSocket.TRIGGER);
const socketChannel = yield call(tradeSocket, payload);
const { cancel } = yield race({
task: call(tradeWatcher, socketChannel),
cancel: take(closeTradeSocket.TRIGGER),
});
if (cancel) {
socketChannel.close();
}
}
}
解决方案
推荐阅读
- amazon-web-services - 当我尝试使用 boto3 创建“put_bucket_replication”时出现“ACCESS_DENIED”错误
- r - 如何在 summarise_all、summarise_if 等中引用特定变量?
- flutter - 关闭接收无限数据流的主题的最佳方法是什么?
- python - 有没有办法从 SQS boto3 接收消息,其中某个属性的值是我们指定的值?
- django - 将身份验证令牌从 Django 传递到 React/Redux 前端
- vb.net - 我无法弄清楚 ProcessStartInfo 并能够使用 Process.Start.StandardOutput.ReadToEnd 来显示命令行中发生的事情
- c++ - 用 std::string 和 std::wstring 对象写入同一个文件
- automation - 如何使用 OxygenHQ 在 IE 浏览器中运行测试?
- wordpress - 在主题选项中使用容器分隔字段数组(碳字段)
- javascript - Javascript检测悬停是在元素的底部还是顶部填充