cari

Rumah  >  Soal Jawab  >  teks badan

javascript - 如何将异步的mongodb查询函数改造成Promise的形式?

最近在学习ES6的Promise,书上的例子我都能理解,不过却无法将其应用于实际开发中,有没有人可以以mongodb的异步查询为例,举例说明一下如何应用Promise呢?
示例代码如下:

function getOne(route,callback) {
        mongodb.open(function(err,db) {
            if (err) {
                mongodb.close();
                return callback(err);
            };
            db.collection('posts',function(err,collection) {
                if (err) {
                    mongodb.close();
                    return callback(err);
                };
                collection.findOne({
                    route:route,
                },function(err,doc) {
                    mongodb.close();
                    if (err) {
                        return callback(err);
                    };
                    if (doc){   
                        callback(null,doc); 
                    } else {    //if page not found
                        callback('404');
                    }
                    
                });
            });
        });
};

比如这段代码,如何将其改造成Promise形式呢?谢谢!

PHPzPHPz2863 hari yang lalu690

membalas semua(3)saya akan balas

  • ringa_lee

    ringa_lee2017-04-11 10:36:42

    首先把你的代码抽象拆分成三个不同的函数:

    var openDB = function() {
        return new Promise(function(resolve, reject) {
            mongodb.open(function(err, db) {
                if (err) {
                    mongodb.close();
                    return reject(err);
                }
                resolve(db);
            });
        });
    };
    
    var getPosts = function(db) {
        return new Promise(function(resolve, reject) {
            db.collection('posts', function(err, collection) {
                if (err) {
                    mongodb.close();
                    return reject(err);
                }
                resolve(collection);
            });
        });
    };
    
    var insertPost = function(collection) {
        return new Promise(function(resolve, reject) {
            collection.insert(post, {safe: true}, function(err) {
                mongodb.close();
                if (err) {
                    return reject(err);
                }
                resolve(null);
            });
        });
    };

    然后,当使用它们时,链式调用,组合一下就是你的结果了:

    openDB()
    .then(function(db) {
        return getPosts(db);
    })
    .then(function(collection) {
        return insertPost(collection, post);
    })
    .catch(function(err) {
        console.log(err); //error捕获在这里
    });

    balas
    0
  • 阿神

    阿神2017-04-11 10:36:42

    mongoDB 驱动原生支持返回 Promise

    balas
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-11 10:36:42

    用 mongoose 更加省事

    balas
    0
  • Batalbalas