javascript - node中Promise也被嵌套了
问题描述
1.假如有两个mongodb集合,一个是users,一个是posts,在posts列表中展示对应的users信息,常规异步处理嵌套太多.就使用Promise来解决,发现,promise解决时也有一个问题.
2. 解决代码如下//封装查询一条函数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); });
这样的方法是否正确?貌似是解决了,但是总感觉哪里不对,,,
问题解答
回答1:promise不是最终解决方案也不见得比回调优雅多少 async/await才是
回答2:有三点,直接把上面的代码写在db_conn的then里面,然后返回this.在最外层统一使用catch捕捉异常。将console.log给删了,看起来怪怪的,
回答3:db_conn().then(db=>{return { db:db, test:’test’, data:{} }}).then(findOneData).then(r=>{ console.log(r);});
最后把你的findOneData改一下接收参数的方式,是不是好点了?
回答4: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);})();
这样是不是更顺眼些?
回答5:Promise 方案是在不增加语言元素的基础上解决异步回调的问题,所以必然存在一些局限性。
在原有的回调之上,Promise 至少会增加一层回调,所以在原回调链很短的情况下,比如题主的情况,只有一层,看起来用 Promise 似乎并无优势,这也是正常的。
如果遇到更复杂的情况,更多层次的嵌套,就能看出用 Promise 的价值了。
楼上各位都提供了很好的写法,我就不多说了。
相关文章:
1. Java中的多人游戏。将客户端(玩家)连接到其他客户端创建的游戏2. javascript - 项目用IE浏览器打开修改前端内容,后台数据修改了,但是前端页面内容不变,用谷歌浏览器测试前端页面可以刷新,求大神解决。3. javascript - ajax 图片文件与文本框数据一起提交上传处理4. javascript - 关于js高级程序中的问题5. javascript - CSS图片轮播显示问题6. node.js - 关于mongoose方法的回调函数的参数问题,如何知道参数个数以及参数代表什么含义呢?7. android - java tm platform se binary 占用很多内存8. thinkPHP5中获取数据库数据后默认选中下拉框的值,传递到后台消失不见。有图有代码,希望有人帮忙9. mysql 怎么做到update只更新一行数据?10. jpa mysql 如何id自增初始值?

网公网安备