在Firebase Cloud Functions中等待地图内的快照值

时间:2019-04-24 01:56:33

标签: node.js firebase firebase-realtime-database google-cloud-functions

我从中收到一个包含产品ID列表及其数据库引用的对象,所以我必须在数据库中搜索每种产品以获取其价格,我已经尝试过类似的方法

  handleDownload = () => {
    console.log("clicked download")
    fetch(`${API_URL}/Results`,
     {
      method: 'GET'
    })
  }

问题在于,const functions = require('firebase-functions'); const cors = require('cors')({ origin: true }); const admin = require('firebase-admin'); var request = require('request'); admin.initializeApp(); exports.GeraPagSeguro = functions.https.onRequest((req, res) => { cors(req, res, () => { if (req.method === 'POST') { var xml; req.body.map((product) => { admin.database().ref(product.refitem).once('value', (snapshot) => { const value = snapshot.val(); const price = value.price; xml += price; //rest of code building the xml i want }) }) //rest of code sending the xml via POST to other server }) }) }) 的所有承诺都没有wait的其余代码。

2 个答案:

答案 0 :(得分:1)

由于firebase数据库函数返回了Promise,因此您可以将函数转换为异步函数并对其调用await。像这样:

exports.GeraPagSeguro = functions.https.onRequest(async (req, res) => {
    cors(req, res, () => {
            if (req.method === 'POST') {
                var xml;
                req.body.map((product) => {
                    const snapshot = await admin.database().ref(product.refitem).once('value')
                    const value = snapshot.val();
                    const price = value.price;
                    xml += price;
                    //rest of code building the xml i want
                })
                //rest of code sending the xml via POST to other server
            })
    })
})

然后,您可以执行其他代码,如“等待” firebase操作一样


注意:默认Firebase功能设置中未启用异步功能,您需要在{{1}中将emcaVersion指定为2017或8(默认为7) }文件,以确保与异步相关的功能正常工作。它应该看起来像这样:

.eslintrc.json

除此之外,您还需要添加{ "parserOptions": { "ecmaVersion": 2017 //or 8 } } 作为插件,如下所示:

promise

如果"plugins": [ "promise" ] 中有任何指定.eslintrc.json使用情况的内容,请将其更改为es6

答案 1 :(得分:1)

要等待多个异步操作完成,请使用)

Promise.all()