GraphQL 解析器 - 何时使解析器函数异步?

GraphQL resolvers - when to make resolver functions async or not?

我在制作基于 Prisma2 和 GraphQL 的 graphql-node 后端服务器时完成了这个 tutorial。本教程没有解释为什么它写了一些 Resolver 函数 async 而有些则没有。

我以为 async 被添加到与数据库交互的函数中,但你可以看到这个 resolver gets data from the database but doesn't use async. But in this resolver 它确实使用了 async.

有人可以解释一下为什么 async 这种看似随意的用法吗?我应该何时以及为何使用它?提前致谢。

您应该做的第一件事是阅读 Promises。 Promise 是 JavaScript 中封装仍在进行的计算的一种方式。当您与数据库或操作系统等外部服务对话时,通常就是这种情况。他们一直在替换回调样式 API。

在 GraphQL 中,解析器可以 return 一个值或 一个解析为值 的 Promise。这意味着,你可以自由选择 returning 一个值或一个 Promise,但是如果你调用像 Prisma 这样的数据库函数,你将得到一个 Promise 返回,所以你有点被迫留在“Promise land”,因为没有办法将 Promise 变成一个值。您只能链接函数,应该使用值“将来”执行(使用 then)。

最后一个要理解的概念是async/await。这些异步语法是对 JavaScript 语法的补充,这使得使用 Promises 更容易。使用 await,您可以停止执行函数,直到 Promise 中的值到达。现在,这看起来像是您正在将 Promise 变回一个值,但实际上,您 隐式地 return 是一个 Promise。为了让 VM 知道这一点,您必须通过在函数前面添加关键字 await 来声明函数可能会使用 async

那么什么时候使用 async 作为解析器?你可以一直这样做,而且代码是正确的。但是这样做,即使您不需要(例如,您没有与服务对话)也可能会对性能产生一些影响。所以最好只这样做,如果你真的想在某处使用 await 关键字。我希望这能让你开始了解上面的概念,真的有很多东西要学。也许只是跟着你的直觉和 TypeScript 错误走,直到你深刻理解发生了什么。