卡了很久的bug
Posted miacara94
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了卡了很久的bug相关的知识,希望对你有一定的参考价值。
背景:在一个简单的项目中,通过循环前端传来的一个数组,使用mongodb条件查询数据,将满足条件的数据push进一个新数组,并返回至前端。
问题:每次调试到第五行,会自动跳过,直接执行12行,打印出来的数据为空
抛出一段代码:
有bug的代码:
1 var dataArr = []; 2 router.get(‘/borrowing‘, (req, res) => { 3 let params = JSON.parse(req.query.borrow); // 执行完这行,直接跳到12行执行 4 5 params.state.forEach(element => { 6 collection.findOne({‘_id‘: element.bID}).then((data) => { 7 dataArr.push(data); 8 // console.log("里面"+dataArr); 9 console.log(data); 10 }) 11 }); 12 console.log("外面"+dataArr); // 直接执行这行 13 res.json({ 14 "status": "ok", 15 "result": dataArr 16 }); 17 });
在网上看到一些类似的问题,参照他们的例子,也找到了自己问题的答案。
首先使用async.map()遍历方法遍历数组,async.map方法是并行执行的,会等到所有数据遍历完之后,最后执行回调函数。
注意:一定要在map中调用callback回调函数,不然写了也不会执行的(亲身经历)
修改之后,能获取到数据的代码:
1 var dataArr = []; 2 router.get(‘/borrowing‘, (req, res) => { 3 let params = JSON.parse(req.query.borrow); 4 async.map(params.state, (item, callback) => { 5 collection.findOne({ 6 ‘_id‘: item.bID 7 }).then((data) => { 8 // dataArr.push(data); 9 // console.log(data); 10 callback(null, data); 11 }) 12 }, (err, results) => { 13 res.json({ 14 "status": "ok", 15 "result": results 16 }); 17 }) 18 });
在解决这次bug中积累到的知识:
1、
res.json({ "status": "ok", "result": results });
不能放在循环里,只能发送一次
2、collection.find()返回符合条件的第一个文档,是一个对象,findOne()返回所有符合条件的对象,是一个数组
3、forEach()遍历数组,对数组中的每一项运行给定函数,但是没有返回值
map()遍历数组,对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组
4、async.eachSeries()用来异步执行一系列操作,保证每次遍历都执行完毕后再执行下一步操作
以上是关于卡了很久的bug的主要内容,如果未能解决你的问题,请参考以下文章
VS2015装上了但是显示成这样,等了很久就是进不去,求大神指导,win7,其他版本还没试过