【问题标题】:Use select effect in normal function/eventChannels在普通函数/eventChannels中使用选择效果
【发布时间】:2017-04-05 16:11:03
【问题描述】:

我正在使用 redux sagas 事件通道。我有一个特定的用例,我想在事件被触发时获取存储状态,因为 eventChannel 不是生成器函数,我无法使用 redux sagas 的选择效果。还有其他方法可以实现吗?

我也尝试过导入 store 并使用 store.getState(),但由于在 store 初始化之前导入了 saga 文件,所以我无法定义。

function subscribe(socket) {
    return eventChannel(emit => {
        socket.subscribe(listenerTopic, {qos: 1});
        socket.on('reconnection', () => {
            // i need to fetch latest unread message, for that i need to get timestamp
           // for last message received which is in store so the command will be to 
         // send sinceDate i.e last message timestamp and untilDate that is currentDate
   })
}

【问题讨论】:

  • 解决方案可能涉及将一些逻辑从 eventEmitter 函数转移到 saga 采取行动。你能分享一些代码,以便我们可以看到 eventEmitter / saga 正在做什么?
  • 我的用例是我需要在连接恢复时获取最新的未读消息,因为我需要获取存储的最后一条消息的时间戳,因此命令将发送 sinceDate 即最后一条消息时间戳和 untilDate 是 currentDate

标签: redux-saga


【解决方案1】:

一种可能的解决方案是使用redux-saga 频道功能。 这个想法是每次发生套接字事件时将事件推送到通道中。同时,您还有另一个 saga 监听通道上的事件并做出相应的反应。因为监听部分是saga,所以可以使用select等常见的saga效果。

您的代码可能如下所示:

import { channel } from 'redux-saga'
import { select } from 'redux-saga/effects'

const socketChannel = channel()

function subscribe(socket) {
  return eventChannel(emit => {
     socket.on('reconnection', () => {
       socketChannel.put({ type: RECONNECTION })
     })
  })
}

export function* watchSocketChannel() {
  while (true) {
    const action = yield take(socketChannel)

    if (action.type === RECONNECTION) {
      const lastMessageTimestamp = yield select(selectors.getLastMessageTimestamp)
      ...
    }
  }
}

希望对你有所帮助。

【讨论】:

  • 监听器函数在回调中返回一些东西,比如 react-native BackHandler BackHandler.addEventListener('hardwareBackPress', return true/false);我如何读取状态数据并根据它决定返回真或假?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 2011-06-08
  • 2021-09-27
  • 1970-01-01
  • 2022-08-10
相关资源
最近更新 更多