处理回调函数[重复]

Posted

技术标签:

【中文标题】处理回调函数[重复]【英文标题】:Handling callback functions [duplicate] 【发布时间】:2013-06-24 08:31:53 【问题描述】:

我正在开发一个需要与 mongoDb 数据库通信的 node.js 项目。我目前正在编写一个函数来使用 th 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);
                );
            );
        );
    );
;

有没有办法减少这种codeception

【问题讨论】:

看看async 为什么你不在你的主函数中声明一个变量并将数据库、集合和游标分配给它们并立即从你的内部回调中返回!这样就可以避免callback-in-callback。 @Boynux,像这样:var database = db.open(function(err, db) if(err) throw err; return db; );? 【参考方案1】:

如果你只是想知道如何合理地清理回调和作用域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:给每个函数一个名字也是记录它的作用的一个很好的方法。有一个匿名函数的地方,但我认为如果你嵌套的深度超过一层,你需要命名它们;) 谢谢!有效!我只需要将db.open 更改为另一个变量名(database.open),因为它返回了Cannot call method 'open' of undefined,但经过这个小小的编辑它就起作用了:)【参考方案2】:

像这样:

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

【讨论】:

这看起来并没有好多少,并且依赖于 .open 同步 我测试了你的代码,它抛出一个错误:无法调用未定义的方法“打开”。在我将var db; 更改为var databasedatabase.collection( 之后,但现在ti 抛出:无法调用未定义的方法“集合” 哦!对不起,可能不好!是的,当然,我会解决的! 哦,最后,您会推荐使用 async.waterfall 还是这种技术? 我会这样做的,谢谢 :)

以上是关于处理回调函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript函数等待回调返回值[重复]

如果回调函数没处理完,又产生了触发该回调函数的事件,怎么处理?

回调函数值[重复]

如何创建从回调函数返回承诺的函数[重复]

Select2回调函数[重复]

在异步函数内部,从回调函数返回值返回 Promise(undefined) [重复]