Я пытаюсь понять / понять, что использовал инструктор схемы GraphQL.
Итак, сначала он сделал что-то вроде этого
const BookType = new GraphQLObjectType({
name: 'Book',
fields: () => ({
id: { type: GraphQLString},
name: { type: GraphQLString},
genre: { type: GraphQLString }
})
})
Здесь он упомянул причину поля должны быть функцией, потому что позже, когда у нас будет несколько типов, они будут ссылаться друг на друга. тогда, если мы не обернем его функцией, один тип не будет знать, какие другие типы (подробнее позже)
А потом, когда он делал RootQuery, он делал что-то вроде этого
const RootQuery = new GraphQLObjectType({
name: "RootQueryType",
fields: {
book: {
type: BookType,
args: { id: { type: GraphQLString }},
resolve(parent, args){
args.id
}
}
}
})
Здесь он сделал fields: { вместо fields: () => ({, для чего он привел следующую причину
Нам не нужно оборачивать его, как поле выше, потому что нам не нужно так сильно беспокоиться о порядке внутри корневого запроса.
[Вопрос:] Я не могу понять его объяснение, поэтому я искал кого-нибудь, кто бы объяснил мне, почему он сделал это fields: { вместо fields: () => ({?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вероятно, это связано с тем, что внутри вашего RootQueryType книга полей не содержит ссылок ни на один из ваших объявленных вами типов, скажем, AuthorType. Таким образом, ваш полевой журнал зависит только от BookType или любого другого GraphQLObject, который вы, возможно, импортировали вверху. То же самое и с автором поля. Внутри не должно быть ссылок на BookType.
Однако в случае ваших пользовательских типов (BookType или AuthorType) они могут содержать ссылки друг на друга и, следовательно, зависят друг от друга.
Поэтому при определении этих настраиваемых типов ваши поля должны быть заключены в функцию. Но когда дело доходит до RootQuery, в этом нет необходимости.
Если вы хотите узнать об этом больше. Ознакомьтесь с концепцией подъема.
Первый - это объект, а второй - функция, возвращающая объект.
Возможно, это глупо спрашивать, но когда мы должны использовать объект (вложенный внутри объекта) и когда мы должны использовать объект, возвращающий функцию? Не могли бы вы включить это в свой ответ?
Я считаю, что когда вы используете функции, они поднимаются наверх. Таким образом, никаких проблем, связанных с зависимостями, не возникает. Однако, когда вы используете объекты / переменные, они выполняются построчно. Итак, если вы находитесь в строке 5 и ваш объект / переменная зависит от того, что вы объявили в программе, скажем, 10, это вызовет ошибку. В случае функций этого не происходит.
Я рассмотрел это позже в видео, и теперь это имеет смысл (хотя и расплывчато). Большое спасибо, не могли бы вы включить свой последний комментарий в ответ. (Отметка как ответ)
Привет, @Haris, во-первых, большое спасибо за ответ. Я также получил то, что вы говорите, через объяснение автора. Мне больше интересно узнать разницу в исполнении, когда мы используем
fields: {вместоfields: () => ({, например, чем они отличаются и как они выполняются.