记录一下前几天踩坑的经历。

背景:一个项目某一版之后很多用easyui的表格控件treegrid渲染的表格都显示不出来了

奇怪的地方主要有以下几点:

  1. 项目在测试环境才会这样,在本机能够正常运行,多次重新发布后无果
  2. 有很多表格显示不出来,但也有的代码几乎一样的表格却能正常显示数据
  3. 重新部署曾经可以正常运行的版本后依然如此

测试环境有问题本地没问题的情况我也是见得不少了,无论如何先F12看看

Uncaught TypeError: Cannot read property 'length' of undefined

观察异常栈,是easyui报的这个错,吐槽一下easyui报的错太不友好。这样很难看出问题,于是我又把测试服务器返回的html与本地服务器返回的html用工具进行比较,结果是只有渲染服务器地址的部分不一样(一个是localhost一个是ip)没看出来任何问题。观察ajax请求的数据,只有数据的id不一样(这是伏笔),id是后台随机生成的用于作表格的唯一标识符,也没有看出来问题。无奈之下,我只有debug到easyui的源码分析原因。

一个小时后。。。

通过对比服务端和本地的代码运行状况,观察差异,找到了报错的原因:id有重复,id重复导致树结构混乱,通过parentId查找父节点时查找到的是错误的父节点。这里再次吐槽一下easyui,您不能先验证一遍id有没有重复,有提示一下不好吗?无论如何,我找到了报错原因,那么接下来问题来了:为什么id会有重复?

System.nanoTime()

前面有提到这里是用的是treegrid控件,这里树有三级,后台方法使用System.nanoTime()方法产生一个随机数作为id设置给第二,三级树节点。这个方法返回的是Long

现在一切都可以解释了。

1.项目在测试环境才会这样,在本机能够正常运行,多次重新发布后无果

System.nanoTime()产生的id会因为环境而有差异,在本地产生的id可能并未达到浮点数精度丢失的范围,而服务端产生的id超过了,导致了精度丢失,不一样的长整型由js处理后转换成浮点数后得到的结果是一样的,10000000000000000和10000000000000001得到的结果是一样的,从而导致了id重复

2.有很多表格显示不出来,但也有的代码几乎一样的表格却能正常显示数据

这一点是数据的问题,表格本身几乎一样但数据不一样,显示出数据的表格没有第三级节点,而报错的表格有,一二级节点因为是父节点所以都有children属性,easyui的treegrid根据此属性形成树结构,而第三级节点没有children属性因为它根本没有子节点,从而导致报错Uncaught TypeError: Cannot read property 'length' of undefined

3.重新部署曾经可以正常运行的版本后依然如此

因为相关代码并没有变动,这是一个地雷,早早埋下而不知何时会爆炸的地雷。

根本原因为后台返回的Long类型数据由js处理后可能导致精度丢失。最后解决方案非常简单,把long转换成int就一切解决了。由此得出教训,后台返回给js的数据不要使用Long类型

参见:

What is JavaScript's highest integer value that a number can go to without losing precision?

javascript没有长整型的更多相关文章

  1. python基础知识2——基本的数据类型——整型,长整型,浮点型,字符串

    磨人的小妖精们啊!终于可以归置下自己的大脑啦,在这里我要把--整型,长整型,浮点型,字符串,列表,元组,字典,集合,这几个知识点特别多的东西,统一的捯饬捯饬,不然一直脑袋里面乱乱的. 对于Python ...

  2. Python基础:数值(布尔型、整型、长整型、浮点型、复数)

    一.概述 Python中的 数值类型(Numeric Types)共有5种:布尔型(bool).整型(int).长整型(long).浮点型(float)和复数(complex). 数值类型支持的主要操 ...

  3. Java把长整型时间转成字符串日期

    数据库里存放的是timestamp格式,前端取得后是这种:1436255550710长整型时间截转换成"2015-07-07"这种格式呢? import java.io.IOExc ...

  4. Python基础:1.数据类型(空、布尔类型、整型、长整型、浮点型、字符串)

    提示:python版本2.7,windows系统 Python提供的基本数据类型:空.布尔类型.整型.长整型.浮点型.字符串.列表.元组.字典.日期 1.空(None) None,是一个特殊的值,不能 ...

  5. JAVA 长整型转换为IP地址的方法

    JAVA 长整型转换为IP地址的方法 代码例如以下: /** * 整型解析为IP地址 * @param num * @return */ public static String int2iP(Lon ...

  6. Long.parseLong(String s) 其中s必须是数字形式的字符串,才能运用该函数转化为长整型。

    public class ConverTo { public static void main(String [] args) { String numberIn =args[0]; convertN ...

  7. php长整型完整输出

    今天调用webservice时返回一个字段是int64 长整型 原始的数值应该是 190000002101056096 而php返回时转成 1.9000000210106E+17 当传入另一个接口就报 ...

  8. PHP长整型在32位系统中强制转化溢出

    CleverCode近期遇到一个PHP项目整形转化问题,mysql有一个字段id是bigint的,里面有长整型,如id = 5147486396.可是php代码因为历史原因却部署在多台机器中,当中A机 ...

  9. Mac地址转换成long长整型 2

    数据之间的转换可以使用   System.Convert Mac地址转换成long长整型 /// <summary> /// 解析长整形的数据使其转换为macID /// </sum ...

随机推荐

  1. jenkins之Job建立-运行 git 脚本

    新建一个自由风格的项目,运行git脚本 1.点击菜单栏中的“新任务” 2.进入该页面后输入一个项目名称,然后选择“构建一个自由风格的软件项目”,滑动到最底端,点击ok(在左下角) 3.进入下图页面后 ...

  2. CF786B Legacy(线段树优化建图)

    嘟嘟嘟 省选Day1T2不仅考了字符串,还考了线段树优化建图.当时不会,现在赶快学一下. 线段树能优化的图就是像这道题一样,一个点像一个区间的点连边,或一个区间像一个点连边.一个个连就是\(O(n ^ ...

  3. C#中指针使用总结(转载)

    C#为了类型安全,默认并不支持指针.但是也并不是说C#不支持指针,我们可以使用unsafe关键词,开启不安全代码(unsafe code)开发模式.在不安全模式下,我们可以直接操作内存,这样就可以使用 ...

  4. ELement-UI之树形表格(treeTable&&treeGrid)

    先上图来一波 支持无限层级,支持新增子级时自动打开父级,支持编辑时自动打开父级,执行操作时自带动画效果,支持初始化时设置全部打开或者关闭,支持一键展开与关闭丝滑般的无延迟 由于基于el-table扩展 ...

  5. try.dot.net 的正确使用姿势

    [简介] 微软官方前不久发布了 try.dot.net 这个有趣的网址,开始只是图个新鲜看了一下,后面通过自身实践过后,发现这着实算是个“有趣”的站点! 首先我们大概地列举一下这个站点能给我们带来什么 ...

  6. Abp vNext 切换MySql数据库

    Abp vNext是Abp的下一代版本,目前还在经一步完善,代码已经全部重写了,好的东西保留了下来,去除了很多笨重的东西,从官宣来看,Abp vNext主要是为了以后微服务架构而诞生的. 从源码来看, ...

  7. @Valid注解的使用(转)

    原文地址:http://blog.csdn.net/xzmeasy/article/details/76098188 @Valid注解用于校验,所属包为:javax.validation.Valid. ...

  8. hMailServer 邮件服务器搭建

    HMailServer是一个运行于微软Windows系统.基于GPL授权.免费的电子邮件系统:支持常见的电子邮件协议SMTP.POP3.IMAP:可以很容易地与许多现有的网络邮件系统集成和二次开发:具 ...

  9. EQueue

    EQueue 2.3.2版本发布(支持高可用) - dotNET跨平台 - CSDN博客https://blog.csdn.net/sD7O95O/article/details/78097193 E ...

  10. EntityFramework Core笔记:表结构及数据基本操作(2)

    1. 表结构操作 1.1 表名 Data Annotations: using System.ComponentModel.DataAnnotations.Schema; [Table("R ...