在阿波罗局部状态突变方面的承诺

时间:2018-12-01 10:53:39

标签: reactjs apollo apollo-client apollo-link-state

我有一个针对我所在州的解析器:

export const resolvers = {
  Mutation: {
    login: (_, { email, password }, { cache }) => {
      const query = gql`
        query GetAdmin {
          admin @client {
            __typename
            isLoggedIn
          }
        }
      `
      const previousState = cache.readQuery({ query })
      let updatedData;
      client.mutate({
        variables: {
          email,
          password,
        },
        mutation: SIGN_IN,
      }).then(({ data }) => {
        updatedData = {
          ...previousState,
          admin: {
            ...previousState.admin,
            isLoggedIn: true,
          },
        }
        cache.writeData({ query, data: updatedData })
        localStorage.setItem('email', data.signInAdmin.email);
        localStorage.setItem('token', data.signInAdmin.authenticationToken);
      });

      return null;
    },
  },
};

此解析器调用另一个突变,该突变在rails服务器上对我的graphql ruby​​进行服务器端调用。

在我的组件中,我使用以下命令进行调用:

client.mutate({
      variables: {
        email: this.refs.email.value,
        password: this.refs.password.value,
      },
      mutation: LOGIN_ADMIN,
    }).then(() => new Promise((resolve) => setTimeout(resolve, 600)))
      .then(() => {
        console.log(client.readQuery({ query: IS_LOGGED_IN }))
      })

我遇到的问题是,诺言解决得太快了,因此本地状态没有及时更新。我通过增加一秒的延迟来解决这个问题。

但是,还有更好的方法吗?

0 个答案:

没有答案