Redux Saga socket.io

Redux Saga socket.io,redux,socket.io,redux-saga,Redux,Socket.io,Redux Saga,我目前正在开发一个聊天客户端,它必须能够接收和发送消息。我面临的唯一问题是,我真的不知道如何在Saga示例中给定的组件内发送消息 我在他们的API文档中找到了这个例子 我是否能够重用我在watchSocketChannel函数中创建的套接字常量?还是只需要创建两次连接?你建议怎么办 import {all, apply, call, fork, put, take} from 'redux-saga/effects' import {eventChannel} from 'redux-saga'

我目前正在开发一个聊天客户端,它必须能够接收和发送消息。我面临的唯一问题是,我真的不知道如何在Saga示例中给定的组件内发送消息

我在他们的API文档中找到了这个例子

我是否能够重用我在watchSocketChannel函数中创建的套接字常量?还是只需要创建两次连接?你建议怎么办

import {all, apply, call, fork, put, take} from 'redux-saga/effects'
import {eventChannel} from 'redux-saga';
import * as actions from "../actions";
import io from 'socket.io-client';

function createSocketConnection(url, namespace) {
    return io(url + '/' + namespace);
}

function createSocketChannel(socket) {
    return eventChannel(emit => {
        const eventHandler = (event) => {
            emit(event.payload);
        };

        const errorHandler = (errorEvent) => {
            emit(new Error(errorEvent.reason));
        };

        socket.on('message', eventHandler);
        socket.on('error', errorHandler);

        const unsubscribe = () => {
            socket.off('message', eventHandler);
        };

        return unsubscribe;
    });
}

function* emitResponse(socket) {
    yield apply(socket, socket.emit, ['message received']);
}

function* writeSocket(socket) {
    while (true) {
        const { eventName, payload } = yield take(actions.WEBSOCKET_SEND);
        socket.emit(eventName, payload);
    }
}

function* watchSocketChannel() {
    const socket = yield call(createSocketConnection, 'http://localhost:3000', 'terminal');
    const socketChannel = yield call(createSocketChannel, socket);

    console.log(socket);

    while (true) {
        try {
            const payload = yield take(socketChannel);
            yield put({type: actions.WEBSOCKET_MESSAGE, payload});
            yield fork(emitResponse, socket);
        } catch (err) {
            console.log('socket error: ', err);
        }
    }
}

export default function* root() {
    yield all([
        fork(watchSocketChannel),
    ])

我知道fork函数将watchSocketChannel函数附加到saga中,并不断地监听

我不确定我是否正确理解了你的问题。。。如果您询问如何/在何处分叉
writeSocket
saga以允许您发送
actions.WEBSOCKET\u SEND)
操作并将消息发送到套接字:

不足以在套接字通道创建的中间添加一个分叉?

const socket = yield call(createSocketConnection, 'http://localhost:3000', 'terminal');
fork(writeSocket, socket); // I've added this line
const socketChannel = yield call(createSocketChannel, socket);

如果您提出了不同的解决方案,请让我们知道。。。如果这对你有帮助,请接受我的回答。这两种方法对于寻找相同(或类似)答案的其他用户都非常有用,我目前正在开发一种解决方案。然而,到目前为止,你的解决方案仍然有效。