Я хочу использовать одну мутацию, чтобы приложение отправляло информацию о пользователе на сервер, а затем получало запрос верхнего уровня на выходе. (Я знаю, что это не очень хорошее соглашение, но я хочу сделать это, чтобы проверить, могу ли я улучшить производительность).
В результате будет только одна мутация, которая берет информацию о пользователе и возвращает фид. Эта мутация обновляет информацию о пользователе, которая выбирается в каждом запросе в контексте запроса. Контекст используется для создания персонализированной ленты. Однако, когда я вызываю эту мутацию, возвращаемый результат вычисляется с использованием старого контекста. Что мне нужно сделать, так это обновить контекст для этой же мутации.
Я записал упрощенную версию кода, чтобы показать, что происходит:
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
}
},
})



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


Так работает 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, верно?