在Firebase云功能中等待地图内的快照值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Firebase云功能中等待地图内的快照值相关的知识,希望对你有一定的参考价值。

我收到一个Object有一个产品ID列表及其数据库的ref,所以我必须在我的数据库中搜索每个产品才能得到它的价格,我试过这样的事情

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的所有承诺的其余代码都没有map

答案

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

var xml;
var promises = [];
req.body.map((product) => {
    promises.push(admin.database().ref(product.refitem).once('value', (snapshot) => {
        const value = snapshot.val();
        const price = value.price;
        return price;
    })
})
Promise.all(promises).then((prices) => {
    prices.forEach((price) => {
        ...
    });
    //rest of code sending the xml via POST to other server
});
另一答案

由于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功能设置中未启用异步功能,您需要在emcaVersion文件中将.eslintrc.json指定为2017或8(默认值为7),以确保Async相关功能正常工作。它应该如下所示:

{
    "parserOptions": {
        "ecmaVersion": 2017 //or 8
    }
}

除此之外,你还需要添加promise作为插件,如下所示:

"plugins": [
    "promise"
 ]

如果.eslintrc.json中有任何指定es6用法的内容,请将其更改为es7

以上是关于在Firebase云功能中等待地图内的快照值的主要内容,如果未能解决你的问题,请参考以下文章

如何将firebase快照值从一个函数提取到另一个函数变量?

Puppeteer 等待页面和 setTimeout 在 Firebase 云功能中不起作用

无法访问 Firestore 快照中的数据以将标记添加到存储在 Firebase 中的 Google 地图

如何从 OnMarkerClickListener 内的 Firebase 数据库中获取特定值?

在加载 Firebase 快照时使用 Flutter 中的 Bloc 流式等待和阻止其他事件

在 swift 4.0 中从 firebase 快照字典中获取值时打开一个可选的 nil