Azure Cosmos数据库和功能JavaScript SDK-如何读取异步文件?

时间:2018-12-05 14:00:42

标签: azure azure-functions azure-cosmosdb apollo apollo-server

我在阿波罗解析器中有以下代码:

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

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

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

调用它时,我想等待client.readDocument完成并给我返回的返回值(上面的示例非常简单,不会这样做)

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

3 个答案:

答案 0 :(得分:2)

我可以在这里想到三种解决方案(使用哪种解决方案取决于您的实际情况):

  1. Cosmos DB API的v2具有异步/等待支持,因此您可以使用它代替回调。
  2. 将回调代码包装在promise中,然后等待promise。
  3. 使用非异步Azure函数,并在回调的末尾以context.done(result)返回结果。

答案 1 :(得分:1)

我建议您转向Java API的v2版本:https://github.com/Azure/azure-cosmos-js

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

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

答案 2 :(得分:1)

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

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

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

然后在执行其他代码之前先在文档上“等待”

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

注意-await仅可在标记为async

的函数中使用