Azure Cosmos db 和函数 javascript sdk - 如何异步读取文档?

Azure Cosmos db and functions javascript sdk - how to read document async?

我在 apollo 解析器中有以下代码:

Mutation: {
    addChannel: (root, args) => {
      client.readDocument("website", {}, (x) => {
        return { id: "Test", name: "Test Channel " + args.name }
      });
    },

其中客户端是文档客户端:

var DocumentClient = require('documentdb').DocumentClient;

当它被调用时,我想等待 client.readDocument 完成并给我一个 return 值,我将 return (上面的示例非常简单并且不会'不要那样做)

我遇到的问题是 readDocument 在后台异步执行某些操作,但该函数不是同步的,因此我无法等待它,因此该函数在回调有机会完成之前立即失效。 return 数据发送后(未定义)回调函数 (x)=>{...} 发生..

我建议您使用 Javascript API 的 v2 版本:https://github.com/Azure/azure-cosmos-js

这样您就可以使用通向 items 的流畅路径并使用 const { body: readDoc } = await item.read(); 异步读取项目。

您可以找到有关如何完成此操作的多个示例here

您的代码的性质不符合 readDocument 遵循的回调模型,因此您没有机制将文档从 addChannel 传回。

假设您不需要事先对文档进行任何预处理,您可以结合使用 promises 和 async / await 语法,例如

addChannel: (root, arg) => 
  new Promise((resolve, reject) => 
    client.readDocument("website", {}, (err, x) => 
      err ? reject(err) : resolve(x)
    )
  );
}

然后到"wait"文件上再执行其他代码

const doc = await obj.addChannel(...);
// use doc

注意 - await 只能在标记为 async

的函数中使用

我能想到的三个解决方案(使用哪个取决于您的具体情况):

  1. Cosmos DB API 的 v2 具有 async/await 支持,因此您可以使用它来代替回调。
  2. 将回调代码包装在承诺中并等待承诺。
  3. 使用非异步 Azure 函数和 return 结果 context.done(result) 在回调结束时。