React:Appsync 订阅在 useEffect 中不起作用
React : Appsync subscription doesn't work in useEffect
我正在使用 React 和 aws-appsync 编写一个新应用程序,但我无法按我想要的方式进行订阅。
我写了一个视图,由路由器调用。这是一个使用状态来存储信息的功能。
为了从我的 api 中获取数据,我将代码写入函数中,由 useEffect 挂钩调用,以便它们只执行一次。这部分我还可以。
我需要订阅 appsync API,我尝试以不同的方式订阅但没有成功:
当我直接从函数中调用它时,代码被调用了 10,000 次。所以我尝试使用钩子:
async function subscribe() {
API.graphql(
graphqlOperation(onAddRunLab, { client_id: userid, lab_id: labid })
).subscribe({
next: ({ provider, value }) => updateInfo(value.data.onAddRunLab),
error: error => console.warn(error)
});
useEffect(() => {
// Create an scoped async function in the hook
async function anyNameFunction() {
await subscribe();
anyNameFunction();
}, []);
但是,它不能使用挂钩。我认为订阅已完成,但在那之后 rect 和 API 之间的 link 丢失并且 updateInfo 函数从未被调用。
你有什么想法吗?
您无需将订阅设置为异步函数,而是执行以下操作并确保取消订阅。
useEffect(() => {
const subscription = API.graphql(
graphqlOperation(onAddRunLab, { client_id: userid, lab_id: labid })
).subscribe({
next: ({ provider, value }) => updateInfo(value.data.onAddRunLab),
error: (error) => console.warn(error),
});
return () => subscription.unsubscribe();
}, []);
我正在使用 React 和 aws-appsync 编写一个新应用程序,但我无法按我想要的方式进行订阅。
我写了一个视图,由路由器调用。这是一个使用状态来存储信息的功能。 为了从我的 api 中获取数据,我将代码写入函数中,由 useEffect 挂钩调用,以便它们只执行一次。这部分我还可以。
我需要订阅 appsync API,我尝试以不同的方式订阅但没有成功:
当我直接从函数中调用它时,代码被调用了 10,000 次。所以我尝试使用钩子:
async function subscribe() {
API.graphql(
graphqlOperation(onAddRunLab, { client_id: userid, lab_id: labid })
).subscribe({
next: ({ provider, value }) => updateInfo(value.data.onAddRunLab),
error: error => console.warn(error)
});
useEffect(() => {
// Create an scoped async function in the hook
async function anyNameFunction() {
await subscribe();
anyNameFunction();
}, []);
但是,它不能使用挂钩。我认为订阅已完成,但在那之后 rect 和 API 之间的 link 丢失并且 updateInfo 函数从未被调用。
你有什么想法吗?
您无需将订阅设置为异步函数,而是执行以下操作并确保取消订阅。
useEffect(() => {
const subscription = API.graphql(
graphqlOperation(onAddRunLab, { client_id: userid, lab_id: labid })
).subscribe({
next: ({ provider, value }) => updateInfo(value.data.onAddRunLab),
error: (error) => console.warn(error),
});
return () => subscription.unsubscribe();
}, []);