Моя немедленная мысль заключается в том, что вы могли бы использовать контекст для достижения чего-то подобного. Я полагаю, что вы могли бы иметь кеш-подобный объект, смешанный с эмиттером событий, чтобы решить проблему состояния гонки.
Например, предположим, что у нас есть некоторый класс
class CacheEmitter extends EventEmitter {
constructor() {
super();
this.cache = {};
}
get(key) {
return new Promise((resolve, reject) => {
// If value2 resolver already ran.
if (this.cache[key]) {
return resolve(this.cache[key]);
}
// If value2 resolver has not already run.
this.on(key, (val) => {
resolve(val);
});
})
}
put(key, value) {
this.cache[key] = value;
this.emit(key, value);
}
}
Затем из ваших преобразователей вы можете сделать что-то вроде этого.
value1Resolver: (parent, args, context, info) => {
return context.cacheEmitter.get('value2').then(val2 => {
doSomethingWithValue2();
});
}
value2Resolver: (parent, args, context, info) => {
return doSomethingToFetch().then(val => {
context.cacheEmitter.put('value2', val);
return val;
}
}
Я не пробовал, но мне кажется, что это может сработать! Если вы дадите ему шанс, мне любопытно, так что дайте мне знать, если это работает. Просто для ведения бухгалтерского учета вам нужно будет убедиться, что вы создаете экземпляр класса CacheEmitter и передаете его в контекст GraphQL на верхнем уровне.
Надеюсь это поможет :)
person
mparis
schedule
12.01.2017
User
, из БД или вычислено, оно должно быть свойствомUser
, а не родственным. Вы всегда можете получить разрешенное значение родителя во внутренних разрешениях. - person Aᴍɪʀ   schedule 15.01.2017