假如有两个mongodb集合,一个是users,一个是posts,在posts列表中展示对应的users信息,常规异步处理嵌套太多.就使用Promise来解决,发现,promise解决时也有一个问题.
//封装查询一条函数
findOneData = function(db, colName, data) {
return new Promise(function(reslove, reject) {
db.collection(colName).find(data).toArray(function(err, data) {
if (err) {
console.log("数据查询错误" + err);
reject(err);
return;
}
reslove({ db: db, data: data });
});
});
};
db_conn()
.then(function(db) {
return findOneData(db, "test", {});
})
.then(function(data) {
console.log(data);
});
这样的方法是否正确?貌似是解决了,但是总感觉哪里不对,,,
滿天的星座2017-06-05 11:13:11
有三点,直接把上面的代码写在db_conn的then里面,然后返回this.
在最外层统一使用catch捕捉异常。
将console.log给删了,看起来怪怪的,
我想大声告诉你2017-06-05 11:13:11
db_conn()
.then(db=>{
return {
db:db,
test:'test',
data:{}
}
})
.then(findOneData)
.then(r=>{
console.log(r);
});
最后把你的findOneData
改一下接收参数的方式,是不是好点了?
PHPz2017-06-05 11:13:11
db_conn()
.then(db => findOneData(db, "test", {}))
.then(data => console.log(data));
这样看起来是不是要顺眼些?
(async function() {
const db = await db_conn();
const data = await findOneData(db, "test", {});
console.log(data);
})();
这样是不是更顺眼些?
迷茫2017-06-05 11:13:11
Promise 方案是在不增加语言元素的基础上解决异步回调的问题,所以必然存在一些局限性。
在原有的回调之上,Promise 至少会增加一层回调,所以在原回调链很短的情况下,比如题主的情况,只有一层,看起来用 Promise 似乎并无优势,这也是正常的。
如果遇到更复杂的情况,更多层次的嵌套,就能看出用 Promise 的价值了。
楼上各位都提供了很好的写法,我就不多说了。