阿波罗中client.writeQuery和optimisticResponse + update之间的区别

时间:2020-06-03 14:28:04

标签: apollo

如果我想在Apollo中实现开放式UI,通常的实现方式如下:

client.mutate({
    mutation: createSurveyResponseMutation,
    variables,
    optimisticResponse: {
        createSurveyResponse: {
            ...variables.input,
            __typename: 'SurveyResponse',
            questionResponses: { __typename: 'ModelQuestionResponseConnection', items: [] },
        },
    },
    update: (store, { data: { createSurveyResponse } }) => {
        store.writeQuery({
            query: myQuery,
            variables: { surveyResponseId: createSurveyResponse.id },
            data: {
                getSurveyResponse: createSurveyResponse,
            },
        });
    },
});

执行此操作与仅在调用突变之前调用client.writeQuery有什么区别?

client.writeQuery({
    query: myQuery,
    variables: { surveyResponseId: response.id },
    data: {
        getSurveyResponse: {
            ...response,
            __typename: 'SurveyResponse',
            questionResponses: { __typename: 'ModelQuestionResponseConnection', items: [] },
        },
    },
});

client.mutate({
    mutation: createSurveyResponseMutation,
    variables,
});

我有几个具体问题:

  1. 如果在第一种情况下突变失败,阿波罗会自动回退您的乐观更新吗?如果我想要这种回滚行为,第二种情况是否是个好选择?
  2. 在第一种情况下,是否保证在致电client.mutate(...)之后立即更新我的乐观更新(例如,可以安全地致电client.mutate(...)并导航到需要商店更新的页面)?如果没有,我的第二种情况是否具有此优势(client.writeQuery()之后立即更新商店)?欢迎提供关于这两个示例的生命周期的任何信息。
  3. 说我做第二种情况,client.writeQuery()client.mutate(...)都成功。由于在client.mutate(...)成功时存储中已经有一个条目,因此该条目将通过服务器响应自动更新,而无需我使用update函数(就像您调用更新突变时一样) ?
  4. 第二种情况是否有优势,还是第一种情况严格更好/更安全?

0 个答案:

没有答案