在`redux-saga`中使用`@apollo/client` `ApolloClient.subscribe` [已关闭]

fcipmucu  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(149)

已关闭,此问题为opinion-based。目前不接受答复。
**想改善这个问题吗?**更新问题,以便editing this post可以用事实和引用来回答。

21小时前关闭
Improve this question
我想使用redux-saga来管理应用状态中事件驱动的更改,同时使用@apollo/client订阅GraphQL服务器上的更改。

  • 是否有关于如何/可以做到这一点的最佳做法?
  • 我这样做是不是滥用了redux-saga@apollo/client

我期望它如何起作用的想法如下:

function* rootSaga () {
   yield fork(watchAccountBalance)
}

function* watchAccountBalance () {
   // @todo Create a subscription
   // @todo Every change on the subscription is passed as `balance`
   if (balance == 0.00) {
      yield put(notifyBalanceEmpty());
   }
}

如果不能做到这一点,就会导致(已经很健壮的)代码库中有许多react钩子,当useSubscription响应发生变化时,这些钩子会将操作分派给redux-saga
简单的实现具有通过查询调用apolloClient.subscribe产生的订阅响应。

function* subscribeAccountBalance() {
  const apolloClient: ApolloClient<NormalizedCacheObject> = yield call(getClient);
  const subscription = yield call([apolloClient, apolloClient.subscribe], {
    query: USER_BALANCE_SUBSCRIPTION,
  });
  console.log(TAG, 'subscription', {subscription});
}

subscription的值为:LOG home/saga subscription {"subscription": {"_subscriber": [Function anonymous]}}

pxq42qpu

pxq42qpu1#

老实说,这看起来有点奇怪。Apollo客户端的重点已经是为你管理你的状态--在大多数情况下,你不应该在此之上添加Redux。(我是从既是Apollo客户端又是Redux维护者的独特位置上说的。
您的数据可能应该保留在一个系统中。如果您没有使用Apollo客户端的缓存功能,那么很有可能一个较低级别的库就可以满足您的需求。或者你在这一点上跳过Redux,让Apollo处理大部分。

相关问题