这周做的项目遇到2个费了很多时间才解决的bug,解决之后,发现根本问题并不是什么很难的技术难点,都是因为自己在写代码的过程中,思维不够清晰。还有一个需要再提高的地方就是解决问题的思维,如何快速定位到问题。

第一个bug很严重:本地前后端联调没有问题,而且调的是和测试环境一样的接口,但是测试环境就是报length为undefined

和同事从晚上8点多一起找问题到晚上12点都没有解决好这个问题。问题出现前我做了一波这样的操作,改了一次代码然后提交到测试环境(自己本地没测试到位就提交了,就是最大的问题),然后就发现挂了。现在想想如果是老赵解决这个问题,他一定会问我刚刚改了些什么,然后会让我把刚刚改的改回去,再去排除bug。如果我们当初改这个bug的时候,是先这样思考的,那么我们也就不会为这个bug花那么多无用的时间了。最终定位到问题的时候,确实是我提交前改的那个变量写错了,这个变量不是一个数组。

如果真的想不起来自己刚改了什么,也应该是先去从那些调用了length的变量上去排除,将所有的可能的数组变量替换成[]一个空值再来判断。

回顾这个问题,想起一件有趣的事情。

第一个,测试环境有问题,但是本地没有问题,说明本地环境还是不行的,出了问题不报错,这是一个需要去思考看能否优化的点,本地环境是否能和测试环境保持一样的环境。至少本地环境能像测试环境一样有问题能在console中暴露出来。第二个,拿到这个问题,我第一个去检查传的数据是否正确,我定位了所有会调用到的方法,最后发现都可以一一执行,数据传递都正常但到最后还是会报length为undefined,我当时就蒙圈了。到底是因为什么原因?现在发现其实定位这个问题并不难,再多想想,拿到数据之后会干嘛?拿到数据当然就是去渲染dom啦,这里就应该怀疑是渲染dom出错了,问题就浮现水面了,dom上有个不是数组的变量读取了length,再去一一排除可能的数组变量就能解决问题了。

第二个bug:数据改变,需要重新触发dom渲染高度。采用js操作dom,重新设置元素高度,但是无效。

场景:切换月份获取当月的数据,对应的表格元素的高度要自适应内容的高度,表格的每一行有一个跨单元格的悬浮的div,这个div中包含内容,当前的行的表格单元格的高度要和这个div的高度保持一直。高度采用js计算,在刚开始进入这个页面的时候就会在等到拿到数据并渲染dom之后去调用这个js逻辑去读取表格中每一行包含的这个悬浮的div的高度,然后再去给对应行的表格的单元格设置对应高度。

按理说操作dom,重新给元素赋值高度是可以,但是不行的时候,是为什么不行?这个方案最后结果不是我们想要的,就要去排除是什么原因导致的不行,如果最后排除原因是方案不行就要换方案,没有排除原因都不能去想着换方案。

高度没有按预期去渲染,看下想要设置的数据是否是正确的,永远打印整个变量去检查数据,因为这次从数组中去读取数据就是打印的其中的部分数据,结果才迟迟没有定位到真的问题,最后发现数据读的总是前面部分的数据,定位到问题是切换月份没有置空之前数组中的数据。

总结:

  1、问题的表象不一定就是真的问题所在,比如第一个bug,看上去像是环境问题导致的,其实不是,只是本地也出错了没有把错误暴露出来,问题根本原因还是代码问题。

  2、解决问题的思路:数据渲染没按预期渲染,检查数据,从预期结果出发,先思考预期结果什么样,然后看看实际结果是什么,思考实际结果出现的原因,问题就浮现了。

12月中旬项目中出现的几个bug解决方法的思考的更多相关文章

  1. 项目总结---- imageLoder 的2个Bug解决方法、1.9.4如何选择性删除disk缓存和其它一些错误。

    我们不说废话,直接入主题,抓紧时间写完,好继续找bug... (PS:imageLoder的bug 百度不到的哦,不过我坚信我的观点没错) 版本1.9.2,1.9.4我没测试 1,imageLoder ...

  2. Type.GetType()反射另外项目中的类时返回null的解决方法

    项目1:ProjectA namespace ProjectA { public class paa { .... } } Type.GetType("paa")返回null Ty ...

  3. electron项目中使用jquery不生效的解决方法

    才开始接触electron的时候,本来想用bootstrap快速搞一个demo,无奈有些功能没法用,之后才意识到是jquery没发用,之后找了一些资料,比较简单的方式就是在引入jquery之前加入一下 ...

  4. [Android Studio Problems]记录克隆项目中遇到的坑(问题)以及解决方法

    ①Migrate project to Gradle? 问题描述: This project does not use the Gradle build system. We recommend th ...

  5. 【Vue中的坑】vue项目中动态绑定src不显示图片解决方法

    v-for绑定src的数据如下: data() { return { img_src:"../../assets/images/mirror-service.png" } } 渲染 ...

  6. vue中npm run dev运行项目不能自动打开浏览器! 以及 webstorm跑vue项目jshint一直提示错误问题的解决方法!

    vue中npm run dev运行项目不能自动打开浏览器!以及 webstorm跑vue项目jshint一直提示错误问题的解决方法! 1.上个项目结束就很久没有使用vue了,最近打算用vue搭建自己的 ...

  7. jquery中checkbox全选失效的解决方法

    这篇文章主要介绍了jquery中checkbox全选失效的解决方法,需要的朋友可以参考下     如果你使用jQuery 1.6 ,代码if ( $(elem).attr(“checked”) ),将 ...

  8. 记一次SpringBoot 开发中所遇到的坑和解决方法

    记一次SpringBoot 开发中所遇到的坑和解决方法 mybatis返回Integer为0,自动转型出现空指针异常 当我们使用Integer去接受数据库中表的数据,如果返回的数据中为0,那么Inte ...

  9. 编程中遇到的Python错误和解决方法汇总整理

    这篇文章主要介绍了自己编程中遇到的Python错误和解决方法汇总整理,本文收集整理了较多的案例,需要的朋友可以参考下   开个贴,用于记录平时经常碰到的Python的错误同时对导致错误的原因进行分析, ...

随机推荐

  1. PIL合并4张图demo 800px以下的居中显示小例子

    from PIL import Image #新建一个空白文件 大小为1600*1600 颜色为白色 newIm= Image.new('RGB', (1600, 1600), 'white') #打 ...

  2. PI上导入RFC

    ERP中创建函数:ZERP_GETSPAREPART 传入参数:SOLD_TO_ID SHIP_TO_ID 表:INTABLE OUTABLE 登陆PI, 后面正常做data type DT_PART ...

  3. IIS+NGINX 负载web服务器

    Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在 ...

  4. 1-Angular学习篇

    Angular 官方学习网站:https://angular.io 1.安装node.js 在angular主页下载node.js安装包 2.创建angular工程 Windows系统在命令窗口输入: ...

  5. Jquery("#form_content").validationEngine()失效原因分析

    使用validationEngine()函数对表单进行各种校验,由于多个页面都引用了相关js文件,后面子页面的validationEngine()始终不生效:....: 测试后发现重复引用了JQuer ...

  6. 如何seo(搜索引擎优化)

    Seo是指遵循搜索引擎的搜索原则,对网站结构.网页文字语言和站点间互动外交等进行合理规划部署,以改善网站在搜索引擎的搜索表现,从而增加客户发现并访问网站的可能性的一个过程.

  7. 201621123075 Week02-Java基本语法与类库

    1.本周学习总结 本周学习了java的数据类型,有基本数据类型和引用数据类型(不同c),特有的boolean类型,取值只有true和false.还有包装类和数组,每一个基本类型都有相对应的包装类,对应 ...

  8. 学习HashMap随笔(更新中)

    1.先来一个HashMap和HashTable的区别: HashMap线程不安全,键值可以为空 HashTable线程安全,键值不可以为空 2.hashmap我理解的是把数组存储和链表存储相结合了 具 ...

  9. 算法复杂度中的O(logN)底数是多少

    前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多少.算法中log级别的时间复杂度都是由于使用了分治思想,这 ...

  10. 写了一个Java的简单缓存模型

    缓存操作接口 /** * 缓存操作接口 * * @author xiudong * * @param <T> */ public interface Cache<T> { /* ...