javascript - 如何将异步的mongodb查询函数改造成Promise的形式?
PHPz
PHPz 2017-04-11 10:34:42
0
3
664

最近在学习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形式呢?谢谢!

PHPz
PHPz

学习是最好的投资!

reply all(3)
左手右手慢动作

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

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捕获在这里
});
阿神

mongoDB 驱动原生支持返回 Promise

伊谢尔伦

用 mongoose 更加省事

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template