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
的函数中使用
我能想到的三个解决方案(使用哪个取决于您的具体情况):
- Cosmos DB API 的 v2 具有 async/await 支持,因此您可以使用它来代替回调。
- 将回调代码包装在承诺中并等待承诺。
- 使用非异步 Azure 函数和 return 结果
context.done(result)
在回调结束时。
我在 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
我能想到的三个解决方案(使用哪个取决于您的具体情况):
- Cosmos DB API 的 v2 具有 async/await 支持,因此您可以使用它来代替回调。
- 将回调代码包装在承诺中并等待承诺。
- 使用非异步 Azure 函数和 return 结果
context.done(result)
在回调结束时。