Heim > Fragen und Antworten > Hauptteil
最近在学习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形式呢?谢谢!
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捕获在这里
});