我想使用
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());
}
}
如果不具备这样做的能力,它将导致(已经很健壮的)代码库有许多反应挂钩,当
redux-saga
响应发生变化时,它们会向 useSubscription
发送操作。
简单的实现具有通过查询调用
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]}}
老实说,这似乎有点奇怪。 Apollo Client 的目的已经是为您管理您的状态——在大多数情况下,您不应该在其之上添加 Redux。 (我是说,从既是 Apollo 客户端又是 Redux 维护者的独特地位出发。)
您的数据可能应该保留在一个系统中。如果您不使用 Apollo Client 的缓存功能,那么较低级别的库很可能就足够了。或者你在那个时候跳过 Redux,让大部分由 Apollo 处理。