ajax使用中发现的问题与深入扩展(for循环中嵌套ajax)

在学习ajax的过程中,我曾经遇到过这样的一个问题,为了得到一个详情列表,我要先向服务器去请求得到索引表,简单描述就是ajax中的success中的for循环中再次嵌套了ajax,结果第二层success中的ajax的success并不能取得上层ajax的success中的值。

我先使用ajax发送请求获得索引表,再使用for循环去依次使用索引目录去获得详情列表中想要的数据。当时因为水平有限,用了一个最不合理的方式,于是产生了这么一个莫名其妙的问题。

但是很奇怪的是每次传入的参数都是undefined,纠结了好久,发现自己的整体思路和代码并没有错误,于是回到ajax的特性上来,忽然一拍脑袋,ajax请求也是事件呢,因此又牵扯到JavaScript中的单线程问题,于是我先把传递数据的下标-1(因为事件排队,for循环已经执行完毕,所以for循环中的最后的数据下标已经越界),果然取得的所有数据都是最后一位,证实了我的想法。

首先,我很单纯的设置了一个全局变量,使用全局变量去保存每次取得的值,但是马上否定了自己,因为这并没有什么意义,因为等ajax事件执行的时候这个全局变量已经又是最后一个值了。

然后我又用了一个自认为比较巧妙的办法,在第二层ajax请求中把想传给下层的ajax的success回调函数的值放在请求数据里,在服务器端的php页面中,把我传入的值再封装到原来要传入到第二个ajax的json数据中。当然,按照预想实现了想要的结果,后来又想了想,如果应用同样的道理,把数据存入sessionStorage或者cookie未尝不可。

但是很快否定了自己的这个想法,因为这样确实解决了问题,当时还是很高兴的,但是回头一想,这样不也是多此一举吗?把数据传入服务器再传入客户端,只是为了两个回调函数之间的数据传输根本划不来。如果服务器不需要向客户端传输数据了呢?这个数据已经没地方可以附加,更不可能给它单写一个方法来接收这个数据。而且本身就是一种风险和开销。因此使用把数据传入服务器再传回客户端实现两个回调函数之间的数据传输并不是一个明智的方法(但是我还是不否定可能将来会有它发挥作用的时候)。存入session来完成两个回调函数之间的传参怎么都让人有一种特别滑稽的感觉。

后来想了想这个逻辑,如果从for循环来讲,我的问题是for循环中的事件会排队,参数不能按照预想传递。如果我把第二层的ajax代码段封装到一个函数中呢?每次循环都调用函数并且给函数传参,使用函数中的参数来保存每次想要传下去的值,发现问题确实简简单单的解决了。

然而过了并不是很久,我仔细想了想, 因为这两次的ajax异步请求是绑定在一起的,是为了去查询两个表中的数据,如果使用两次ajax去请求资源是不是本身就有问题?为什么不能合并成一起?于是我修改了自己的php文件结构,在服务器端先查询一次索引表,再通过循环去数据库查询详情表。把结果拼接成自己想要的json数据一次打包传回来。

在后面的学习中,我突然意识到数据库语句本身就很强大,如果两个表有关系是否可以一次查询呢?好像大学里的知识印象冒出来了一点,然后去补了一下下数据库的知识(数据库并不是很好,只能完成基本的增删改查QAQ),原来在服务器端的数据库中使用多表查询就可以完全解决这个问题。好吧,问题至此解决(至少目前)。

虽然一个简单的问题让我绕了一圈才得以完美的解决,但是在初学的路上,我觉得应该学到的更多的是思维的方法,解决问题的方式,举一反三的能力。很感谢在诸多问题困挠的情况下自己还能这么的去想去钻研一下问题,验证一些想法。将来可能觉得现在所有的问题都那么幼稚,但是我相信,在这条漫漫的成长之路上,等某天回顾的时候,风景会是很美的

上一篇:springboot测试


下一篇:Spring源码之IOC容器创建、BeanDefinition加载和注册和IOC容器依赖注入