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),原来在服务器端的数据库中使用多表查询就可以完全解决这个问题。好吧,问题至此解决(至少目前)。
虽然一个简单的问题让我绕了一圈才得以完美的解决,但是在初学的路上,我觉得应该学到的更多的是思维的方法,解决问题的方式,举一反三的能力。很感谢在诸多问题困挠的情况下自己还能这么的去想去钻研一下问题,验证一些想法。将来可能觉得现在所有的问题都那么幼稚,但是我相信,在这条漫漫的成长之路上,等某天回顾的时候,风景会是很美的
ajax使用中发现的问题与深入扩展(for循环中嵌套ajax)的更多相关文章
- 循环内部嵌套ajax请求
循环内部ajax请求涉及到循环变量的取值问题: 例如: for(var i=0; i<items.length; i++){ zzurl = items[i].url; $.ajax({ typ ...
- For循环中由于ajax异步导致的问题解决(增加alert数据正常,去掉alert之后数据错误)
由于ajax异步请求的机制,for循环运行不会等内部ajax请求结束,而直接循环到最后.解决方法:将for循环里面的请求单独封装一个方法. 个人遇到的问题具体如下 下面这段代码,如果第5行studat ...
- 如何处理ajax中嵌套一个ajax
在做项目的时候 遇到过第二次了 当我第二次去问'公子'的时候 被吐槽了 原来我以前遇到过 只是忘记了...他老人家竟然还记得... ajax由于他的异步特性 在第一次请求中的循环中嵌套第二个ajax会 ...
- Django中的Ajax
Ajax 很多时候,我们在网页上请求操作时,不需要刷新页面.实现这种功能的技术就要Ajax!(本人定义,不可迷信) jQuery中的ajax就可以实现不刷新页面就能向后台请求或提交数据的功能,我们仍然 ...
- ajax嵌套ajax 可能出现问题 的解决办法
ajax由于他的异步特性 在第一次请求中的循环中嵌套第二个ajax会数据会读不出来 第一种 描述:如果条件许可,把两次请求都放在服务端处理掉一起发回来,这些就在客户端只有一次ajax了 优点:代码放在 ...
- php安装soap等扩展的方式: 已经安装了php却发现少安装了一下扩展
php安装soap等扩展的方式: 已经安装了php却发现少安装了一下扩展 1.首先确认下php.ini的安装位置 我的安装目录是: /usr/local/php 一般位置: /usr/local/ph ...
- jQuery中的Ajax几种请求方式
1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中. url (String) : 请求的HTML页的URL地址. data (M ...
- ThinkPHP中使用ajax接收json数据的方法
本文实例讲述了ThinkPHP中使用ajax接收json数据的方法.分享给大家供大家参考.具体分析如下: 这里通过ThinkPHP+jquery实现ajax,扩展了下,写了个查询,前台代码如下: 首先 ...
- jQuery中的ajax使用详解
$.ajax({ type : "get", url : "http://www.w3school.com.cn/jquery/ajax_ajax.asp&quo ...
随机推荐
- 【HDOJ】1043 Eight
这道题目最开始做的时候wa+TLE.后面知道需要状态压缩,最近A掉.并且练习一下各种搜索算法. 1. 逆向BFS+康拓展开. #include <iostream> #include &l ...
- ClassNotFoundException
在 java socket 通信,使用 ObjectInputStream 的 readObject 时, 出现了问题. ServerProject 问题描述是这样的: java.lang.Class ...
- bzoj3083 3306
又见bzoj的语言歧视,囧……bzoj3083过了本地的数据在上面出现各种奇葩的TLE835083 phile 3083 Time_Limit_Exceed 17092 kb 4872 ms Pasc ...
- 移动存储卡仍然用FAT32文件系统的真相
微软在2001年就为自家的XP系统的本地磁盘默认使用了NTFS文件系统,但是12年之后,市面上的USB可移动设备和SD卡等外置存储器仍然在用着FAT32文件格式,这是什么理由让硬件厂商选择过时的文件系 ...
- UIImageVIew的使用
UIImageView是一个用于显示图片的控件 构造方法: UIImage * tempImage = [UIImage imageNamed:IMAGE_NAME]; imageVi ...
- GDI+ —— Tcanvas 类属性及方法.......
delphi TCanvas类 类关系 TObject-> TPersistent 对那些作图对象,可使用TCanvas对象作为画布.标准的window控件,例如编辑控件和列表框控件,当 ...
- 《University Calculus》-chape6-定积分的应用-平面曲线长度
平面曲线的长度: 积分的重要作用体现在处理曲线和曲面. 在这里我们讨论平面中一条用参数形式表达的曲线:x=f(t),y=g(t),a≤t≤b. 如图. y=f(x)形式的弧长计算: 之前我们讨论过平面 ...
- 自主架设VOIP系统
my.oschina.net/fcboys/blog/2695 FXS (Foreign Exchange Station) FXS is an interface which drives a te ...
- StopWatch
附件 http://download.csdn.net/detail/teststudio/6575241 主窗体UNIT unit MainForm; interface uses Windows, ...
- [CSS] Transforms
Degrees and Turns Degrees are just one value that can be set to a rotate transform to determine how ...