Кажется очевидным и интуитивно понятным, что с учетом запроса, подобного приведенному ниже, мы извлекаем один объект Book
по его свойству id
.
query DetailView($id: ID) {
book(id: $id) {
id
title
abstract
}
}
Однако в этом примере имяаргумента здесь (id
) просто совпадает с именем свойства, используемого кешем (id
).Вне соглашения нет ничего, что говорит, что сам аргумент нельзя назвать bookId
, bookID
или supercalifragilisticexpialidocious
.Даже если запрос возвращает тип Book
и принимает один или несколько аргументов, Apollo не может определить, какой аргумент фактически является идентификатором, который использовался при нормализации кэша.Точно так же, если существуют другие аргументы, они могут иметь или не иметь значения в отношении того, может ли использоваться то, что в данный момент кэшировано, или нет - для определения этого необходима дополнительная логика.
Другое соображение здесь заключается в том, что за пределами необязательнопередавая экземпляр IntrospectionFragmentMatcher
вашему InMemoryCache
, Apollo фактически не знает, что представляет собой схема конечной точки, которую он запрашивает.Типы, используемые кешем при нормализации, определяются после запроса, полученного с использованием свойства __typename
.Весь смысл cacheRedirects
состоит в том, чтобы предотвратить запуск запроса, если элемент или элементы уже находятся в кэше.Однако, учитывая конкретный запрос, Apollo не может знать, что он будет возвращать определенный тип до тех пор, пока не вернется этот запрос.cacheRedirects
предоставляет способ сказать "этот запрос будет возвращать этот конкретный тип", даже не запустив запрос в первую очередь.