处理回调函数

时间:2013-06-27 01:14:42

标签: javascript node.js asynchronous callback

我正在开发一个node.js项目,我需要在该项目中与mongoDb数据库进行通信。我目前正在编程一个函数,使用node-mongodb-native模块在我的数据库中查找一些数据。一切正常,但我的代码看起来像回调中的回调回调中的回调...

我创建了这个函数,以防止每次我想访问我的数据库时都使用回调。我现在只需要调用这个函数。

module.exports.find = function(query, projection, callback){
    db.open(function(err, db){
        if(err) throw err;
        db.collection('rooms', function(err, collection){
            if(err) throw err;
            collection.find(query, projection, function(err, cursor){
                if (err) throw err;
                cursor.toArray(function(err, find){
                    db.close();
                    callback(err, find);
                });
            });
        });
    });
};

是否有减少此代码的方法?

2 个答案:

答案 0 :(得分:2)

如果你只是想知道如何合理地清理回调和范围db:

module.exports.find = function(query, projection, callback){
    var local_db;

    function db_open(err, db) {
        if(err) throw err;
        local_db = db;
        local_db.collection('rooms', handle_homes_collection);

    }

    function handle_homes_collection(err, collection){
        if(err) throw err;
        collection.find(query, projection, handle_find_query);
    }

    function handle_find_query(err, cursor){
        if (err) throw err;
        cursor.toArray(function(err, find){
            local_db.close();
            callback(err, find);
        });
    }

    db.open(db_open);
};

答案 1 :(得分:0)

像这样:

module.exports.find = function(query, projection, callback){
    var database;

    db.open(function(err, db_temp){
        if(err) throw err;

        database = db_temp;
    });

    database.collection('rooms', function(err, collection){
        if(err) throw err;
        collection.find(query, projection, function(err, cursor){
            if (err) throw err;
            cursor.toArray(function(err, find){
                db.close();
                callback(err, find);
            });
        });
    });
};