Amplify 会为您生成数据存储样板代码,但您仍需要调用它。您不会为每个用户和每个突变付费。
您只会为每个用户订阅用户感兴趣的内容的突变(显式调用代码以监听更改)。例如如果您正在查看 TODO 项目,您可以为用户订阅该项目,他们会立即查看其他人是否在另一台设备上对其进行了修改。
更新
长话短说...我通过 GraphQL 通过制作 lambda 解析器来触发后端计算。计算时间过长,GQL 调用会超时。我更新了代码,因此 GQL 调用异步调用自身(重新触发 lambda),并立即返回。然后,当长时间运行的任务在 spun-up lambda 中完成时,我更新了数据库中的一条记录。
我使用 AppSync 而不是直接 GQL 更新记录,因此它会触发突变,并且在反应客户端中,我会监听将要更新的特定记录的突变。这样,只有 1 个用户在监听(如果他们触发了长时间运行的操作),并且该用户只会收到有关他们感兴趣的单个数据库记录的更改的通知,而不会收到其他用户的更新。
我不知道这一切是否适用于你的情况。下面的代码 sn-ps 可能会对您有所帮助,但它们有些断章取义。
// In amplify/backend/api/projectname/schema.graphql
type Subscription {
onCouponWithIdUpdated(id: ID!): Coupon @aws_subscribe(mutations: ["updateCoupon"])
}
// In my useSendCoupon hook...
// Subscribe to coupon updates
useEffect(() => {
if (0 === couponId) {
return
}
console.log(`subscribe to coupon updates for couponId:`, couponId)
const onCouponWithIdUpdated = /* GraphQL */ `
subscription OnCouponWithIdUpdated($id: ID!) {
onCouponWithIdUpdated(id: $id) {
id
proofLink
owner
}
}
`
const subscription = API
.graphql(graphqlOperation(onCouponWithIdUpdated, { id: couponId }))
.subscribe({
next: ({ provider, value }) => {
const coupon = value.data.onCouponWithIdUpdated
//console.log(`Proof Link:`, coupon.proofLink)
setProofLinks([coupon.proofLink])
setSendCouponState(COUPON_STATE_PREVIEW_SUCCESS)
},
error: error => console.warn(error)
})
console.log('subscribed: ', subscription)
return () => {
console.log(`unsubscribe to coupon updates`)
subscription.unsubscribe()
}
}, [couponId])
// inside a lambda...
const updateCouponWithProof = async (authorization, couponId, proofLink) => {
const initializeClient = () => new AWSAppSyncClient({
url: process.env.API_XXXX_GRAPHQLAPIENDPOINTOUTPUT,
region: process.env.REGION,
auth: {
type: AUTH_TYPE.AMAZON_COGNITO_USER_POOLS,
jwtToken: authorization
},
disableOffline: true,
})
const executeMutation = async (mutation, operationName, variables) => {
const client = initializeClient()
try {
const response = await client.mutate({
mutation: gql(mutation),
variables,
fetchPolicy: "no-cache",
})
return response.data[operationName]
} catch (err) {
console.log("Error while trying to mutate data", err)
throw JSON.stringify(err)
}
}
const updateCoupon = /* GraphQL */ `
mutation UpdateCoupon(
$input: UpdateCouponInput!
$condition: ModelCouponConditionInput
) {
updateCoupon(input: $input, condition: $condition) {
id
proofLink
owner
}
}
`
const variables = { input: { id: couponId, proofLink } }
try {
return await executeMutation(updateCoupon, 'updateCoupon', variables)
} catch (error) {
console.log(`executeMutation error`, error)
}
}