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 ...
 
随机推荐
- ECHO.js  纯javascript轻量级延迟加载
			
演示 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf ...
 - Robotium 不能同时跑多个case
			
最近在用robotium做android自动化测试,遇到单个case可以run成功.多个case run就会卡死到第二个case. 原因是在teardown的时候没有将打开的activity全部fin ...
 - R语言 系统聚类分析1
			
#聚类分析是一类将数据所研究对象进行分类的统计方法,这一类方法的共同特点是:#事先不知道类别的个数与结构 据以进行分类的数据是对象之间的相似性 或差异性数据#将这些相似(相异)性数据看成是对象之间的距 ...
 - 这次GDC China 2015的总结与关卡设计教程的梳理
			
去年关卡教程总结链接:听了GDC2014关于关卡设计的讲座的总结与自己的理解 24 号去了GDC china听了讲座,没有听unity没有听VR,听了一天关卡教程,和上次的关卡教程还是有区别的,这次的 ...
 - Windbg扩展的一些参考文章
			
Windbg脚本和扩展工具开篇http://www.cnblogs.com/pugang/archive/2012/11/30/2796617.html WinDbg简单扩展DLL http://ww ...
 - Scrapinghub | Professional Services
			
VShell破解版 VShell破解版 Scrapinghub | Professional Services OUR PROFESSIONAL SERVICES INCLUDE
 - hdoj 1342 Lotto【dfs】
			
Lotto Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
 - CentOS让root用户可以SSH登录
			
一.说明 Solaris 10 出于安全原因,默认参数很严格,禁止root用户直接使用ssh登陆 二.处理 1.可以先用非root的帐户,登陆到ssh后,su成root 2.如 ...
 - 几个命令行命令的总结(node, babel-cli, babel-node)
			
node: 输入node, 进入repl环境之后,可以直接运行javascsript表达式,模拟node输出 sh-it-nb0023:static xialei$ node > console ...
 - LINQ 从 CSV 文件生成 XML
			
本文参考:http://msdn.microsoft.com/zh-cn/library/bb387090.aspx 下面的代码对字符串数组执行 LINQ 查询. 在 C# 版本中,该查询使用 let ...