Обновить контекст graphql в мутации для выходного объекта той же мутации

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

В результате будет только одна мутация, которая берет информацию о пользователе и возвращает фид. Эта мутация обновляет информацию о пользователе, которая выбирается в каждом запросе в контексте запроса. Контекст используется для создания персонализированной ленты. Однако, когда я вызываю эту мутацию, возвращаемый результат вычисляется с использованием старого контекста. Что мне нужно сделать, так это обновить контекст для этой же мутации.

Я записал упрощенную версию кода, чтобы показать, что происходит:



const UserType = new GraphQLObjectType({
  name: 'User',
  fields: () => ({
    someData: {
      type: GraphQLList(Post),
      resolve: (user, args, context) => getFeed(context) // context in here is the old context.
    },
  })
})

const someMutation = mutationWithClientMutationId({
  name: 'someMutation',
  inputFields: {
    location: { type: GraphQLString },
  },
  outputFields: {
    user: {
      type: UserType,
      resolve: (source, args, context) => getUser(context.location),
    },
  },
  mutateAndGetPayload: async (data, context) => {

    updateUserInfo(data)
    // I have tried updating context like this but it's not working.
    context = { location: data.location }

    return {
        // I even tried putting user here like this:
        // user: getUser(data.location)
        // However, the resulting query fails when running getFeed(context)
        // the context is still the old context
    }
  },
})
Поведение ключевого слова "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) для оценки ваших знаний,...
6
0
380
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Так работает JavaScript. Вы можете переназначить значение параметра функции, но это не изменит значение, которое было передано функции.

function makeTrue (value) {
  value = true
  console.info(value) // true
}

var myVariable = false
makeTrue(myVariable)
console.info(myVariable) // false

Если значение, которое вы передаете функции, является объектом или массивом, вы можете мутировать его, и исходное значение также будет изменено, потому что объекты и массивы в Javascript передаются по ссылке.

function makeItTrue (value) {
  value.it = true
  console.info(value.it) // true
}

var myVariable = { it: false }
makeTrue(myVariable)
console.info(myVariable.it) // true

Другими словами, вам нужно изменить параметр context вместо его переназначения.

Так что все, что мне нужно сделать вместо context = {location: data.location}, это сделать context.location = newLocation, верно?

Mo Ganji 12.01.2020 09:19

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