我正在使用 Firestore、Cloud Functions 和 Dialogflow 创建一个 Google Home 应用。我的云函数应该返回基于集合中的值的计算,但我只能返回一个 Promise。
// query firestore based on user
var transactions = db.collection('accounts')
.doc(request.body.result.parameters.accountowner)
.collection('transactions');
var accountbalance = await transactions.get()
.then(snapshot => {
var workingbalance = 0
snapshot.forEach(doc => {
workingbalance = workingbalance + doc.data().amount;
});
return workingbalance
})
.catch(err => {
console.log('Error getting transactions', err);
});
console.log(accountbalance)
balanceresponse = {
"speech": request.body.result.parameters.accountowner + " has a balance of $" + accountbalance,
"displayText": request.body.result.parameters.accountowner + " has an account balance of $" + accountbalance,
"data": {},
"contextOut": [],
"source": "system"
}
response.send(balanceresponse);
如何在调用 response.send 之前等待 promise 返回实际值?我还尝试将 response.send 放在 then 中,但该函数会在操作完成之前完成并发送 header 。
最佳答案
如果您使用 promise,则需要将返回值作为 Promise.then 链的一部分。这通常是通过将一堆 .then()
调用/ block 链接在一起来完成的。请记住,then()
部分只会在 Promise 解析时被调用。
在您的情况下,看起来您可以生成 balanceresponse
并在计算 workingbalance
之后调用 response.send()
,在内部相同的代码块。对 response.send()
的调用不需要在函数的末尾。所以你可能让那个 block 看起来像:
.then(snapshot => {
var workingbalance = 0
snapshot.forEach(doc => {
workingbalance = workingbalance + doc.data().amount;
});
balanceresponse = {
"speech": request.body.result.parameters.accountowner + " has a balance of $" + workingbalance,
"displayText": request.body.result.parameters.accountowner + " has an account balance of $" + workingbalance,
"data": {},
"contextOut": [],
"source": "system"
}
response.send(balanceresponse);
})
如果出于某种原因,您想将计算分开并在不同的 block 中计算 balanceresponse
,您可以这样做。我不一定推荐这样做,但它有一些优点(例如,您可以在每个部分之后放置多个 catch block ,我已在此处展示):
// query firestore based on user
var transactions = db.collection('accounts')
.doc(request.body.result.parameters.accountowner)
.collection('transactions');
await transactions.get()
.then(snapshot => {
var workingbalance = 0
snapshot.forEach(doc => {
workingbalance = workingbalance + doc.data().amount;
});
return workingbalance
})
.catch(err => {
console.log('Error getting transactions', err);
});
.then( accountbalance => {
balanceresponse = {
"speech": request.body.result.parameters.accountowner + " has a balance of $" + accountbalance,
"displayText": request.body.result.parameters.accountowner + " has an account balance of $" + accountbalance,
"data": {},
"contextOut": [],
"source": "system"
}
response.send(balanceresponse);
})
.catch(err => {
console.log('Error sending response', err);
});
关于javascript - promise 后 Firestore 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48054068/