reactjs - Redux saga 未在实时套接字上调度操作

标签 reactjs redux socket.io redux-saga laravel-echo

每当使用 redux-saga 的实时套接字上出现响应时,我都会尝试调度一个操作。 我已经能够到达应该放置(调度)操作的代码行,但仅在这种实时套接字情况下,实时操作不会调度。

这是我的代码:

export function* watchEditorAcceptInvitatioRequest(action) {
    yield takeEvery(START_EDITOR_ACCEPT_INVITATION_SOCKET, edditorAcceptInvitationSocket)
}

export function* edditorAcceptInvitationSocket(action) {
    const {token, user_id} = action.payload
    const subscription = SocketIo.subscribe(token, '/broadcasting/authTest')

    yield put(listenEditorAcceptInvitationSocket())
    let result = yield call(SocketIo.listen, subscription, `new-test-channel.${user_id}`,
        '.new-test-test', (response) => edditorAcceptInvitationReceived({
            func: receiveEditorAcceptInvitationSocket,
            response: response
        }))

}

export function* edditorAcceptInvitationReceived(action) {
    while(true) {

        console.log(action.response) // I am seeing this in response but the action put in blow line
        yield put(action.func(action.response))
    }
}

下面是socket订阅和监听代码:

import Echo from 'laravel-echo'
import Socketio from 'socket.io-client'

const BASE_URL = 'https://www.my domain.com'
const PORT = 1111

const subscribe = (token, authEndpoint) => new Echo({
    broadcaster: 'socket.io',
    host: `${BASE_URL}:${PORT}`,
    client: Socketio,
    authEndpoint: authEndpoint,
    auth: {
        headers: {
            Authorization: 'Bearer ' + token,
            Accept: 'application/json',
        },
    },
})

const listen = (echo, channel, event, callback) => {
    echo.private(channel).listen(event, e => {
        const generator = callback(e)
        generator.next()
    })
}

export default {
    subscribe,
    listen
}

这里缺少什么,任何帮助将不胜感激。

最佳答案

我能够通过eventChannel解决这个问题

上面示例的工作代码是:

export function* watchEditorAcceptInvitatioRequest(action) {
    yield takeEvery(START_EDITOR_ACCEPT_INVITATION_SOCKET, edditorAcceptInvitationSocket)
}

export function* edditorAcceptInvitationSocket(action) {
    const {token, user_id} = action.payload
    const subscription = SocketIo.subscribe(token, '/broadcasting/authTest')
    yield put(listenEditorAcceptInvitationSocket())
    let channel = yield call(SocketIo.listen, subscription, `new-test-channel.${user_id}`,
        '.new-test-test', receiveEditorAcceptInvitationSocket)
    while (true) {
        const action = yield take(channel)
        yield put(action)
    }
}

下面是更新的套接字订阅和监听代码:

从“../store/configureStore”导入商店 从“laravel-echo”导入 Echo 从“socket.io-client”导入 Socketio 从 'redux-saga' 导入 {eventChannel}

const BASE_URL = 'https://www.my domain.com'
const PORT = 1111

const subscribe = (token, authEndpoint) => new Echo({
    broadcaster: 'socket.io',
    host: `${BASE_URL}:${PORT}`,
    client: Socketio,
    authEndpoint: authEndpoint,
    auth: {
        headers: {
            Authorization: 'Bearer ' + token,
            Accept: 'application/json',
        },
    },
})

const listen = (echo, channel, event, callback) => {
    return eventChannel( emitter => {
        echo.private(channel).listen(event, e => {
            emitter(store.dispatch(callback(e)))
        })
        return () => {
            console.log('returning channel')
        }
    })}

export default {
    subscribe,
    listen
}

关于reactjs - Redux saga 未在实时套接字上调度操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66171896/

相关文章:

javascript - 为什么 socket.io 不能很好地处理点击事件?

reactjs - React Native 0.64 FBReactNativeSpec 语法错误 : Unexpected token ) PhaseScriptExecution

javascript - 单击时显示 antd 水平菜单

javascript - ReactJs + Redux ---> 尝试调用企业名称,其中 item.business_id === BusinessId

javascript - 如何将对象插入另一个根数组内的数组中

javascript - React-Redux 删除 HTTP 请求

mysql - 如何使用socket.io访问mysql数据库

javascript - 如何使用 mysql 数据库中的 nodejs 和 socket.io 在网页上获取实时更新?

javascript - 在这个非常简单的虚拟应用程序上,错误的处理程序捕获了 Flux 操作,为什么?

javascript - 当两个子组件相同且父组件在条件上不同时如何渲染