需要一些帮助。假设我请求以下数据:
{
parent {
obj1 {
value1
}
obj2 {
value2
}
}
}
我需要 value1 解析器中 value2 的结果进行计算。
想过在 value2 中返回一个承诺并以某种方式将其放入 value1 解析器中,但是如果 value2 解析器尚未运行怎么办?
有什么办法可以做到吗?
我的第一反应是,你可以利用上下文来实现这样的目标。我想你可以有一个类似缓存的对象与事件发射器混合来解决竞争条件问题。
例如,假设我们有一些课程
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 上下文中。
希望这可以帮助 :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)