发现问题

在使用d3.js时,我们经常会使用d3.csv()或者d3.json()函数来从文件中读取出数据,不幸的是,偶尔代码的结果并不是我们预料的那样。习惯了过程式编程的我开始的时候也是这样,最让人头疼的是javascript并不会告诉你问题出在哪里了。我第一次遇到这个问题的时候,找了半天bug,确定代码主体部分没有问题之后,我只能开始使用console.log()将变量一个一个的输出到控制台里。
第一次遇到这个问题时的图片是这样的:
问题出在第72行和第75行,中间几行完全没有对ordertxt进行操作,但是最后的结果就是和预想的输出不吻合,后来找了个其他方法把这个问题给解决了,今天又遇到了类似的这个问题,就下决心来拔掉这根刺。
试验
\<script\>
console.log("before csv1 ");
d3.csv("flowers.csv", function(data) {console.log(data)});
console.log("before csv2");
d3.csv("flowers.csv",function(error,data2) {console.log(error, data2)});
\</script\>
believe it or not,上面的代码将产生下面图中的输出结果,因为javascript的 异步特性 。说到异步,大部分时候是让人开心的,但偶尔也会令人头疼,至少在这里,就是令人头疼。
解决方法1
第一次遇到这个问题的时候,我巧妙的绕开了这个问题,使用的方法是:我把数据的处理放在了d3.csv(“flowers.csv”,function(data){dealWithData()…})回调函数里面,这样数据的处理就和d3的读文件操作变成了绑在一根绳上的蚂蚱了,要么一起执行完,要么都不执行。貌似世界和平了,但是今天下午又遇到了这个问题,而且数据的变化是随时随地的,可不是和上一次遇到的那样,所有会发生的变化都可以预先写成代码的。于是我开始了对解决方法的苦苦追寻。
解决方法2
第二种方法是借助一些helper类库(queue.js)来强制数据在加载完成之后才去触发相应的操作。这种方法是我在网上看到的,并没有去亲自试过,也许会成功,但是对于我们会变化的数据,不能提前将处理逻辑写出代码,这种方法还是不合格的。
解决方法3
第三种方法是在stack overflow里查到的,试了一下是可以的,他这里用的是d3.text()函数,将文件先load进来,然后再使用d3.csv.parse或者d3.csv.parseRows,这样就会是同步的了。参考文末的Reference 3的实现。
解决方法4
方法4是我自己想出来的,最近几天一直在做angular和d3结合在一起的工作,我就在想能否借助angular来帮助我们完成呢?万幸,Angular中确实有这么一个函数,似乎就是为这个问题量身定做的,且解决了前面的方法都没有解决的数据后期动态变化的问题。这个函数就是 $watch 函数。
$watch列表
每当我们在视图中追踪一个事件时,会给它注册一个回调函数,然后希望在页面中触发该事件时调用这个回调函数。比如AngularJS中最令人印象深刻的双向绑定,在input中输入一个字母,有着相同ng-model的变量就会跟着input的输入而发生改变。
发生这一变化的原因是我们把UI中的输入字段绑定给了$scope.name属性,为了更新这个视图,Angular需要 追踪变化 ,是通过给$watch列表添加一个监控函数做到这一点的。
脏检查
脏检查是一个简单的过程,可归结为一个非常基础的概念:检查值是否发生了变化,而整个应用还没同步该变化。Angular会遍历$watch列表,只要有任何的值发生比变化,应用将会退回到$watch循环中,直到检测到不在发生任何变化。
$watch
$scope对象上的$watch方法会给Angular事件循环内的每个$digest调用装配一个脏检查,如果在检测到变化,Angular总是会返回$digest循环。
$watch函数本身接受两个必要参数和一个可选的参数,第一个参数是watch的对象,第二个参数是 回调函数 ,一旦watch的对象变了的时候触发;可选的参数是一个bool值,告诉Angular是否检查 严格相等 。
关于回调函数和严格相等,还有一些想说的。
回调函数
我一直是这么理解回调函数的,研究生的导师会分配给每个研究生活去干,而他自己也有自己的事情,如果给某个研究生安排的活他做好了,就过来给他说一声,导师负责汇总,将活写成论文发表出去。这其实就是回调函数工作的原理。当然导师不可能在这边等着研究生干活,自己什么都不干;或者自己什么都干了,也没研究生什么事了。
严格相等
比如有一个数组,a=【1,2,3】,后面修改了a【0】=2,在AngularJS看来,这个数组并没有发生变化,因为还是3个变量,而如果从严格意义上来说,它已经发生了变化,这就是严格相等和相等的不同,在javascript中,也有==和===的区别。
实现
写到这里,大家应该知道该怎么做了,即调用$watch函数来观测我们需要关注的data,每当发生变化的时候,就根据新的data,重新绘制图标。因此,我们最好将render的过程抽象成一个函数,方便我们后期调用。比如,我们想要观测data数组的变化,并且根据它的变化来重新绘制图片。那么我们的代码实现就应该像下面这样。
scope.$watch("data", function() {
render();
//render函数是绘制的过程,换成自己的即可。
},true);
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
# 异步读取文件
# js
# 同步
# 异步
# JavaScript文件的同步和异步加载的实现代码
# 浅谈js文件引用方式及其同步执行与异步执行
# 同步异步动态引入js文件的几种方法总结
# JS 动态加载js文件和css文件 同步/异步的两种简单方式
# javascript 文件的同步加载与异步加载实现原理
# Nodejs实现多文件夹文件同步
# 这个问题
# 回调
# 解决方法
# 的是
# 自己的
# 是一个
# 就会
# 让人
# 也有
# 找了
# 可选
# 种方法
# 绑定
# 出在
# 检测到
# 后期
# 发生了
# 加载
# 解决了
# 一个函数
相关文章:
岳西云建站教程与模板下载_一站式快速建站系统操作指南
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
南京网站制作费用,南京远驱官方网站?
如何在Tomcat中配置并部署网站项目?
建站之星如何实现五合一智能建站与营销推广?
建站之星会员如何解锁更多建站功能?
如何快速搭建高效简练网站?
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
如何挑选优质建站一级代理提升网站排名?
制作网页的网站有哪些,电脑上怎么做网页?
如何在VPS电脑上快速搭建网站?
建站之星ASP如何实现CMS高效搭建与安全管理?
上海网站制作开发公司,上海买房比较好的网站有哪些?
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
北京的网站制作公司有哪些,哪个视频网站最好?
宝塔建站助手安装配置与建站模板使用全流程解析
表情包在线制作网站免费,表情包怎么弄?
如何通过虚拟机搭建网站?详细步骤解析
如何批量查询域名的建站时间记录?
如何在阿里云ECS服务器部署织梦CMS网站?
安云自助建站系统如何快速提升SEO排名?
网站制作报价单模板图片,小松挖机官方网站报价?
青浦网站制作公司有哪些,苹果官网发货地是哪里?
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
黑客如何通过漏洞一步步攻陷网站服务器?
如何在新浪SAE免费搭建个人博客?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何选择高性价比服务器搭建个人网站?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
建站之星安装后如何配置SEO及设计样式?
网站制作公司排行榜,四大门户网站排名?
如何获取PHP WAP自助建站系统源码?
黑客入侵网站服务器的常见手法有哪些?
建站主机默认首页配置指南:核心功能与访问路径优化
如何在阿里云虚拟主机上快速搭建个人网站?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
平台云上自主建站:模板化设计与智能工具打造高效网站
建站主机无法访问?如何排查域名与服务器问题
,柠檬视频怎样兑换vip?
如何配置WinSCP新建站点的密钥验证步骤?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
如何通过FTP服务器快速搭建网站?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
模具网站制作流程,如何找模具客户?
*请认真填写需求信息,我们会在24小时内与您取得联系。