javascript - promise mongoose 循环遍历查询
问题描述
let result = []; //存放查询结果model.WithdrawModel.find({status:’processing’}, (err, doc) => { if (err) {console.log(err);res.json({ code: -1, msg: ’查询失败’});return; } else {doc.map((item) => { model.UserModel.findOne({phone:item.phone},’name IDcard bank bankCard bank_area bank_name’, (err, bankInfo) => {if (err) { console.log(err);} else { let obj = {}; Object.assign(obj, JSON.parse(JSON.stringify(item)), JSON.parse(JSON.stringify(bankInfo))); result.push(obj); console.log(result); } })});res.json({ code: 0, msg: ’查询成功’, result: result});return; } });
循环遍历查询,上述 result 直接返回空值,请问怎么保证 doc.map 内部的查询都结束之后再取出 result 的值?
问题解答
回答1:自问自答吧,也是受人指点。
promise.all 实现如下:
let result = []; //存放查询结果let doc1 = []; //存放第一次查询的结果model.WithdrawModel.find({status:’processing’}).exec().then((doc) => { doc1 = doc; const promises = doc.map(item => model.UserModel.findOne({phone:item.phone},’name IDcard bank bankCard bank_area bank_name’)); return Promise.all(promises);}).then((bankInfoList) => {//promise.all返回的结果是一一对应的 for(let i=0; i<doc1.length; i++){let obj = {};Object.assign(obj, JSON.parse(JSON.stringify(doc1[i])), JSON.parse(JSON.stringify(bankInfoList[i])));result.push(obj); } return new Promise((resolve, reject) => { resolve(result); }) }).then((result) => { return new Promise(() => {res.json({ code: 0, msg: ’查询成功’, result: result});return; });}).catch((e) => { console.log(e); res.json({ code: -1, msg: ’查询失败’}); return;});
--------------------------------------补充-------------------------------------------------
计数的思想仍然是可以实现的,使用 event 模块即可:
由于Promise是异步调用,所以在所有的查询之后使用return,会在还没真正获取到数据之后就返回,所以需要Promise内添加一个计数器count,在所有的Promise下,加一个循环,当所有的doc都循环到了(count == doc.length),才可以输出返回。
const deasync = require(’deasync’); // 引入deasync包...let result = []; //存放查询结果model.WithdrawModel.find({status: ’processing’}, (err, doc) => { if(err) {console.log(err);res.json({code: -1, msg: ’查询失败’});return; } else {let count = 0, len = doc.length;doc.forEach((item, index) => { model.UserModel.findOne({phone: item.phone}, ’name IDcard bank bankCard bank_area bank_name’, (err, bankInfo) => {if (err) { console.log(err);} else { let obj = {}; Object.assign(obj, JSON.parse(JSON.stringify(item)), JSON.parse(JSON.stringify(bankInfo))); result.push(obj); console.log(result); }count++; });});deasync.loopWhile(() => count < len);res.json({code: 0, msg: ’查询成功’, result: result});return; }});
相关文章:
1. javascript - 如图,百度首页,查看源代码为什么什么都没有?2. html - 急求,能否用flex或者高端点的CSS来布局这个图呢?不想用浮动或定位了3. html5 - 只用CSS如何实现input框的宽度随框里输入的内容长短自动适应?4. javascript - 百度坐标,返回目标附近有哪些坐标5. PHP类中的$this6. 请教各位大佬,浏览器点 提交实例为什么没有反应7. android - 百度地图拖拽图标后原来位置的图标还在?8. javascript - 初学angularJS+express,路由路径中/转换成%2F,导致路径失效,求原因?9. php - 淘宝订单拆单表设计10. html5 - H5中播放的视频如何有效的进行知识产权保护-防下载防盗链

网公网安备