node.js - 在nodejs中回调内部回调?

标签 node.js mongodb

我有以下 nodejs 代码:

app.get('/dashboard', function(req, res){

    db.collection('com_url_mamy').find().toArray(function(err, doc){
      db.collection('com_url_mamy').find({'price':''}).count(function(err, docs){
        db.collection('com_url_mamy').find({"price":{$not:{$ne:"last_price_1"}}}).count(function(err, last_doc){

        if(err){console.log(err);}
        console.log(docs);
      res.render('dashboard',{'doc':doc, 'docs':docs, 'last_doc':last_doc});
    });
    });
  });

这里我必须添加更多的两个或三个查询/回调。

但我认为这不是正确的做法。 请任何人告诉我如何解决这个问题以提高性能。

谢谢

最佳答案

在这种情况下,使用 async/await 将是避免回调 hell 的合适解决方案。考虑按如下方式运行查询:

app.get('/user/:name', async (req, res, next) => {
    try {
        const docs = await db.collection('com_url_mamy').find().toArray()
        const count = await db.collection('com_url_mamy').find({'price':''}).count()
        const last_doc = await db.collection('com_url_mamy').find({"price": "last_price_1"}).count()

        res.render('dashboard', { docs, count, last_doc })
    } catch (err) {
        return next(err)
    }
}

作为替代方案,您可以使用 async 库尤其是 async.parallel() 当您需要运行多个相互不依赖的任务并且当它们全部完成时执行其他操作时的方法。

考虑以下示例:

app.get('/user/:name', function(req, res, next) {
    var locals = {};
    async.parallel([

        // Load all documents 
        function(callback) {
            db.collection('com_url_mamy').find().toArray(function(err, docs){
                if (err) return callback(err);
                locals.docs = docs;
                callback();
            });
        },

        // Get count of documents where price is empty 
        function(callback) {
            db.collection('com_url_mamy').find({'price':''}).count(function(err, count){
                if (err) return callback(err);
                locals.count = count;
                callback();
            });
        },

        // Load last docs 
        function(callback) {
            db.collection('com_url_mamy').find({"price": "last_price_1"}).count(function(err, docs){
                if (err) return callback(err);
                locals.last_doc = docs;
                callback();
            });
        }
    ], function(err) { //This function gets called after the three tasks have called their "task callbacks"
        if (err) return next(err);
        //Here render dashboard with locals object
        res.render('dashboard', locals);
    });
});

关于node.js - 在nodejs中回调内部回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35813911/

相关文章:

javascript - 找不到模块 'mongodb/node_modules/bson'

java - spring data mongodb 映射动态字段

node.js - npm安装问题无法下载win32-x64-83_binding.node

node.js - 如何查询目录树而不将其加载到内存中

node.js - Mongodb find 查询花费太多时间

javascript - 在 NodeJS 中使用 mongoose 设置值

mongodb - 对于 1 到 N 的关系,Mongo 中的双向引用是否更有效?

javascript - 如何使用 node-js 使用聚合函数

JavaScript 简单 BitConverter

javascript - 如何用回调包装 promise ?