【问题标题】:Retrieving data in a snapshot.forEach loop在 snapshot.forEach 循环中检索数据
【发布时间】:2018-08-14 10:33:16
【问题描述】:

我正在尝试编写一个 firebase 云函数来遍历特定节点的所有子节点,检查数据库的不同部分是否有相应的数据,并将所有数值相加。

基本上,我希望云函数创建列表中所有商品的总价格,但使用数据库的不同部分来检索该商品的价格。

exports.onAddToCart = functions.database.ref('/users/user_cart/{uid}/items').onWrite((change, context) =>{
    let totalCost = 0;
    return admin.database().ref('/users/user_cart/' + context.params.uid + '/items').once('value').then((snapshot) => {
        snapshot.forEach((child) => {
            return admin.database().ref('/serv/' + child.val()).once('value').then((snapshot2) => {
                totalCost += snapshot2.val().price;
            });
            return false;
        });
        return admin.database().ref('/users/user_cart/' + context.params.uid + '/price').set(totalCost);
    });
});

此代码不起作用

问题是snapshot.forEach 需要返回一个布尔值而不是一个承诺。我怎样才能做到这一点?或者这不可行?

【问题讨论】:

标签: typescript firebase google-cloud-functions


【解决方案1】:

我最终创建了一组承诺,每个承诺都映射到价格的位置

exports.onAddToCart = functions.database.ref('/users/user_cart/{uid}/items').onWrite((change, context) =>{

let totalCost = 0;
const itemList: string[] = [];

return admin.database().ref('/users/user_cart/' + context.params.uid + '/items').once('value').then((snapshot) =>{

    snapshot.forEach((child) => {

        itemList.push(child.val());
        return false;

    })

    return itemList;

}).then((items) => {

    const promiseList: Promise<any>[] = [];

    for (let i = 0; i < items.length; i++){

        promiseList.push(admin.database().ref('/services/' + items[i]).once('value').then((value) =>{

            totalCost += value.val().price;

        }));

    }

    return Promise.all(promiseList);

}).then(() =>{

    return admin.database().ref('/users/user_cart/' + context.params.uid + '/total').set(totalCost);

});

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多