Reactjs / Apollo / AppSync Mutation乐观响应已解决ID

时间:2018-01-30 19:25:06

标签: reactjs graphql react-apollo aws-appsync

首先,我将首先说我添加了对我的突变的乐观反应,因此它将停止生成重复项,如引用的here和之前的S.O. question

所以这一切都有效,但我有一组依赖的突变,在第一次使用异步等待之后运行。

  submitForm = async () => {
    // Only submit if form is complete
    if (!this.state.saveDisabled) {
      try {
        // Optimistic Response is necessary because of AWS AppSync
        // https://stackoverflow.com/a/48349020/2111538
        const createGuestData = await this.props.createGuest({
          name: this.state.name,
        })
        let guestId = createGuestData.data.addGuest.id

        for (let person of this.state.people) {
          await this.props.createPerson({
            variables: {
              name: person.name,
              guestId,
            },
            optimisticResponse: {
              addPerson: {
                id: -1, // A temporary id. The server decides the real id.
                name: person.name,
                guestId,
                __typename: 'Person',
              },
            },
          })
        }

        this.setState({
          redirect: true,
        })
      } catch (e) {
        console.log(e)
        alert('There was an error creating this guest')
      }
    } else {
      Alert('Please fill out guest form completely.')
    }
  }

现在这样可行,并且根据示例项目使用相同的突变模式

export default compose(
  graphql(CreateGuestMutation, {
    name: 'createGuest',
    options: {
      refetchQueries: [{ query: AllGuest }],
    },
    props: props => ({
      createGuest: guest => {
        console.log(guest)
        return props.createGuest({
          variables: guest,
          optimisticResponse: () => ({
            addGuest: {
              ...guest,
              id: uuid(),
              persons: [],
              __typename: 'Guest',
            },
          }),
        })
      },
    }),
  }),
  graphql(CreatePersonMutation, {
    name: 'createPerson',
  }),
)(CreateGuest)

唯一的问题是我无法强制状态更新为使用Async Await时实际插入的ID,因此所有人员条目都获得占位符UUID。注意,我也尝试使用id: -1,就像使用createPerson变异一样,但没有改变任何东西,只是对所有的entires都使用了负数。

有更好的方法吗?我做错了什么。这一切都没有optimisticResponse,但每次突变总是创建两个条目。

1 个答案:

答案 0 :(得分:2)

你能再试一次吗? AppSync SDK for Javascript的增强功能不再需要您使用乐观响应。如果您仍需要乐观的UI,则可以选择使用它。

此外,如果使用disableOffline这样对您的应用不是必需的,您现在也可以停用离线功能:

const client = new AWSAppSyncClient({
    url: AppSync.graphqlEndpoint,
    region: AppSync.region,
    auth: {
        type: AUTH_TYPE.API_KEY,
        apiKey: AppSync.apiKey,
    },
    disableOffline: true
});