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

alo*_*p99 8 javascript node.js graphql graphql-js

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

{
  parent {
    obj1    {
        value1
    }
    obj2    {
        value2
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

想在value2中返回一个promise并以某种方式将它带入value1解析器,但是如果value2解析器还没有运行呢?

有什么办法可以做到的吗?

mpa*_*ris 7

我的直接想法是您可以使用上下文来实现这样的目标。我想你可以将一个类似缓存的对象与一个事件发射器混合在一起来解决竞争条件问题。

例如,假设我们有一些类

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

然后从你的解析器你可以做这样的事情。

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

我还没有尝试过,但似乎对我有用!如果你试一试,我很好奇,所以让我知道它是否有效。只是为了簿记,您需要确保实例化“CacheEmitter”类并将其提供给顶层的 GraphQL 上下文。

希望这可以帮助 :)


小智 5

根据graphql-resolvers:“GraphQL 目前不支持一个字段依赖于另一个字段的解析结果”。使用 EventEmiter 似乎是实现此目的的一种非常不符合规范的方法。graphql-tools 提供了帮助器函数,允许您以多种对您有帮助的方式组成解析器。