Sails.js 异步请求

Sails.js Async request

我想统计某个类别中有多少企业,但我坚持使用异步概念。

这是我已有的:

Category.getall(function(err, cat){

    if(err) return res.negotiate(err);

    catIds = []

    for( var iCat in cat){

        catIds.push(cat[iCat].id)

        // and here I would like do something like

        Entreprise.count({category_id: cat[iCat].id}, function(err, nbr){

            categoriesOUT.push({categorie: cat, entreprise_number: nbr })

            // I know that i can not do it but it's just to help to understand the logic I would like to have.
            if(cat.length==iCat){
                return res.json({categories: categoriesOUT})
            }

        })

    }

})

有几种方法可以解决这个问题。一种是引入像 Q 这样的 promise 库。另一个是单个数据库调用,它可以计算按 category_id 分组的企业对象...但是,我认为这会超出 Waterline 的正常查询范围,您将不得不使用 .query.native 什么的。

对您来说,最简单的快速解决方法是只记录您已处理的结果数量。使用几次后您可能会厌倦这种方法,但它看起来像这样:

Category.getall(function(err, cat){
    if(err) { return res.negotiate(err); }
    var catIds = [], categoriesOut = [], processedCategories = 0;
    for( var iCat in cat){
        catIds.push(cat[iCat].id)

        Entreprise.count({category_id: cat[iCat].id}, function(err, nbr) {
            if (err) {
                categoriesOUT.push({categorie: cat, entreprise_number: 0});
            } else {
                categoriesOUT.push({categorie: cat, entreprise_number: nbr });
            }
            processedCategories += 1;
            if (processedCategories >= cat.length) {
                return res.json({categories: categoriesOUT});
            }
        });
    }
});

这是我最终如何按照@arbuthnott的建议仅通过MySQL请求获得它 (这里的类别字段是call domaine)

    Domaine.getall(function(err, domaines){

        if(err){return res.negotiate(err)}

        var domNames = {}, domContain = {}, domOut = [];

        Entreprise.query('SELECT domaine_id, COUNT(*) FROM entreprise GROUP BY domaine_id', function(err, entreprises){
            if(err){return res.negotiate(err)}

            entreprises = JSON.parse(JSON.stringify(entreprises));

            for(var ent of entreprises){

                domContain[ent['domaine_id']] = ent['COUNT(*)'];
            }

            for(var iDom in domaines){

                var countAdded = false;

                for(var dc in domContain){                      

                    if(dc==domaines[iDom].id) {
                        domaines[iDom].entreprises_count = domContain[dc];
                        countAdded = true;
                    }

                }

                if(!countAdded) domaines[iDom].entreprises_count = 0;

            }

            res.json({domaines:domaines})

        })

    })