Heim > Fragen und Antworten > Hauptteil
Wenn es zwei Mongodb-Sammlungen gibt, eine für Benutzer und die andere für Beiträge, und die entsprechenden Benutzerinformationen in der Beitragsliste angezeigt werden, ist die herkömmliche asynchrone Verarbeitung zu verschachtelt, um das Problem zu lösen, und es wurde festgestellt, dass es auch eine gibt Problem beim Lösen von Versprechen
2. Der Lösungscode lautet wie folgt//封装查询一条函数
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 的价值了。
楼上各位都提供了很好的写法,我就不多说了。