Sails.js异步请求

时间:2018-02-06 14:32:58

标签: asynchronous sails.js

我想算一下有多少企业属于某种类别,但我坚持使用asynchrone概念。

这是我已经拥有的东西:

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})
            }

        })

    }

})

2 个答案:

答案 0 :(得分:1)

有几种方法可以解决这个问题。一个是引入像Q这样的承诺库。另一个是单个数据库调用,可以计算按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});
            }
        });
    }
});

答案 1 :(得分:0)

以下是我最终只能通过@arbuthnott提出的MySQL请求来获取它 (类别字段在这里调用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})

        })

    })