我在阿波罗解析器中有以下代码:
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)=> {...}。
答案 0 :(得分:2)
我可以在这里想到三种解决方案(使用哪种解决方案取决于您的实际情况):
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