javascript – GraphQL:从兄弟解析器访问另一个解析器/字段输出

需要一些帮助.我想请求以下数据:

{
  parent {
    obj1    {
        value1
    }
    obj2    {
        value2
    }
  }
}

我需要value1解析器中value2的结果进行计算.

想在value2中返回一个promise并以某种方式将它带入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上下文.

希望这可以帮助 :)

转载注明原文:javascript – GraphQL:从兄弟解析器访问另一个解析器/字段输出 - 代码日志