javascript - promise 后 Firestore 返回

标签 javascript node.js firebase google-cloud-firestore google-cloud-functions

我正在使用 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/

相关文章:

javascript - TypeError : _firebase__WEBPACK_IMPORTED_MODULE_2__. default.collection 不是函数

javascript - hapi 服务器出现错误

node.js - 无法运行全局安装的 Node 包

javascript - Nodejs 查找已知蓝牙设备

javascript - 在多个元素中将进度条显示为滚动

javascript - 将属性传递给 DOM 中的 React 组件

javascript - Angular Material 中居中对齐的网格列表

javascript - 在 react 中使用上下文时如何初始化 firebase?

android - Flutter - 如何在应用邀请功能的 Firebase 动态链接中传递自定义参数?

ios - 如何让 firebase GIDSignin 始终询问用户电子邮件和密码?