在使用Promise.all()forEach之后呈现NodeJS页面之前等待加载Firebase数据

时间:2016-12-28 21:27:58

标签: javascript node.js asynchronous firebase promise

我尝试创建一个从Firebase加载多个数据集的页面,然后将它们传递给NodeJS呈现的页面。我非常感谢帮助确保在forEach迭代之后发生这种情况;也就是说,我不确定如何让Firebase forEach迭代成为我承诺的一部分。

非常感谢你!

router.get('/', function(req, res, next) {

    var getBrands = brandRef.once('value').then(function(snapshot){
        var brands = [];

        snapshot.forEach(function(childSnapshot){
            console.log(childSnapshot.val()['name']);
            brands.push({'name' : childSnapshot.val()['name'] });
        });

        return brands;
    });
    var getStores = storeRef.once('value').then(function(snapshot){
        var stores = [];

        snapshot.forEach(function(childSnapshot){
            stores.push({'name' : childSnapshot.val()['name'] });
        });

        return stores;
    });
    var getProducts = productRef.once('value').then(function(snapshot){
        var products = [];

        snapshot.forEach(function(childSnapshot){
            products.push({'name' : childSnapshot.val()['name'] });
        });

        return products;
    });

    console.log(brands, stores, products);
    Promise.all([getBrands, getStores, getProducts]).then(function(results){

        res.render('index', { title: 'MStore Demo Portal', stores: results[0], brands: results[1], products: results[2] });
    });
});

2 个答案:

答案 0 :(得分:2)

您的代码看起来很好99%

router.get('/', function(req, res, next) {
    var getBrands = ...;
    var getStores = ...;
    var getProducts = ...;

到目前为止一直很好(甚至没有打扰复制代码,因为它是正确的

    console.log(brands, stores, products);

品牌,商店和产品在.then回调中声明,因此无论如何,此时它们始终未定义

    Promise.all([getBrands, getStores, getProducts]).then(function(results){

        res.render('index', { title: 'MStore Demo Portal', stores: results[0], brands: results[1], products: results[2] });
    });
});

上面唯一的“问题”是,由于您在Promsie.all中的brands, stores, products订单,结果将为getBrands, getStores, getProducts

但是,您似乎(根据索引)认为结果将是stores, brands, products - 在代码中交换索引0和1,或者调用

Promise.all([getStores, getBrands, getProducts]).then

小费,如果您使用的是最近的node.js,则可以执行以下操作

Promise.all([getStores, getBrands, getProducts]).then(([stores, brands, products]) =>
    res.render('index', { title: 'MStore Demo Portal', stores, brands, products })
);

答案 1 :(得分:1)

Firebase旨在成为无服务器架构。从长远来看,您不需要标准的RESTFul Node.js API服务器。你只需要Lambda工作人员。请参阅:https://github.com/firebase/firebase-queue

将工作放在队列中,工作人员将接收作业并更新Firebase。当Firebase更新时,它会向您的前端发送消息。它都是异步的,几乎适用于任何应用程序。

拥有API服务器也没有错,但实际上并不需要它。除非你有充分的理由让我认为它是一个Express API服务器,否则你可以抛弃它。

看起来您正在使用此代码执行的操作是从数据库获取值,您可以使用前端而不是API服务器执行此操作,并将结果合并到前端,这样做要好得多这样的事情。

从字面上看,只需使用Express中的代码,然后将其移至您的前端应用程序:)