卡了很久的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,其他版本还没试过

mac常用软件,自用找了很久的分享一下相信很多人需要

找了很久的网上唯一的一套JVM底层Hotspot源码视频,免费送!

迟来的2020年度总结,顺带附上被鸽了很久的自我介绍

荒废了很久的java以及微信公众平台今天拿起来看了看:这里有很好的教程