Разница в javascript между объектом конструктора функции и объектом внутри объекта

Я пытаюсь понять / понять, что использовал инструктор схемы 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: () => ({?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вероятно, это связано с тем, что внутри вашего RootQueryType книга полей не содержит ссылок ни на один из ваших объявленных вами типов, скажем, AuthorType. Таким образом, ваш полевой журнал зависит только от BookType или любого другого GraphQLObject, который вы, возможно, импортировали вверху. То же самое и с автором поля. Внутри не должно быть ссылок на BookType.

Однако в случае ваших пользовательских типов (BookType или AuthorType) они могут содержать ссылки друг на друга и, следовательно, зависят друг от друга.

Поэтому при определении этих настраиваемых типов ваши поля должны быть заключены в функцию. Но когда дело доходит до RootQuery, в этом нет необходимости.

Если вы хотите узнать об этом больше. Ознакомьтесь с концепцией подъема.

Привет, @Haris, во-первых, большое спасибо за ответ. Я также получил то, что вы говорите, через объяснение автора. Мне больше интересно узнать разницу в исполнении, когда мы используем fields: { вместо fields: () => ({, например, чем они отличаются и как они выполняются.

iRohitBhatia 15.10.2018 13:53

Первый - это объект, а второй - функция, возвращающая объект.

Haris Ghauri 15.10.2018 13:56

Возможно, это глупо спрашивать, но когда мы должны использовать объект (вложенный внутри объекта) и когда мы должны использовать объект, возвращающий функцию? Не могли бы вы включить это в свой ответ?

iRohitBhatia 15.10.2018 13:58

Я считаю, что когда вы используете функции, они поднимаются наверх. Таким образом, никаких проблем, связанных с зависимостями, не возникает. Однако, когда вы используете объекты / переменные, они выполняются построчно. Итак, если вы находитесь в строке 5 и ваш объект / переменная зависит от того, что вы объявили в программе, скажем, 10, это вызовет ошибку. В случае функций этого не происходит.

Haris Ghauri 15.10.2018 14:03

Я рассмотрел это позже в видео, и теперь это имеет смысл (хотя и расплывчато). Большое спасибо, не могли бы вы включить свой последний комментарий в ответ. (Отметка как ответ)

iRohitBhatia 16.10.2018 14:23

Другие вопросы по теме