how to cancel / disable previous mutation onSuccess calls?

For now the best I could come up with is this:

let mutationCounter = 0
const addTodo = createMutation(() => ({
  mutationFn: api.createTodo,
  async onMutate(newTodoTitle: string) {
    const previousTodos = queryClient.getQueryData<api.Todo[]>(["todos"]) ?? []

    const newID = Math.floor(Math.random() * 1000)
    const newTodo = { id: newID, title: newTodoTitle, done: false }
    const newTodos = [...previousTodos, newTodo]

    queryClient.setQueryData(["todos"], newTodos)

    mutationCounter++
    return { previousTodos, todoCounter: mutationCounter }
  },
  onError(_err, _newTodo, context) {
    queryClient.setQueryData(["todos"], context?.previousTodos)
  },
  onSuccess(data, _vars, context) {
    let isLatest = context?.todoCounter === mutationCounter
    if (isLatest) {
      queryClient.setQueryData(["todos"], data)
    }
  },
}))


Keep in mind that this is using solidjs, hence the raw mutationCounter.

The createTodo returns an array of todos.
Was this page helpful?