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 ...
随机推荐
- Bluetooth LE(低功耗蓝牙) - 第六部分(完)
在本系列前面的文章中我们已经了解了,在我们从一个TI SensorTag中获取温度和湿度数据之前,我们需要经历的各种步骤.在本系列中的最后一篇文章,我们将完成注册并接收SensorTag的通知,并接收 ...
- MonkeyRunner 连续两次点击报“Error sending touch event”
最近用monkeyrunner做自动化测试,遇到连续两次点击,第二次点击就会报错“Error sending touch event”. 具体做法如下: device.touch(234,112, ' ...
- poj1935
给定起点和要经过的点,求最短路径我发现,关于路径的treedp,设计的关键在于每个节点的状态怎么表示对于这道题,有一种常见的方法是令f[i,1]表示经过这个点且还要回来的路径,f[i,0]表示留在以i ...
- Spark SQL利器:cacheTable/uncacheTable
Spark相对于Hadoop MapReduce有一个很显著的特性就是“迭代计算”(作为一个MapReduce的忠实粉丝,能这样说,大家都懂了吧),这在我们的业务场景里真的是非常有用. 假设我们有 ...
- APP界面设计之页面布局的22条基本原则
移动 APP 页面布局(Layout)是我们设计 app 界面的时候,最主要的设计任务.一个 app 的好与不好,很大部分取决于移动 APP 页面布局的合理性. 下图为 APP 最原始的布局模型. 页 ...
- poj 2151
http://poj.org/problem?id=2151 Check ...
- git问题 next fetch will store in remotes/origin
项目在git的下无法查找到需要的Branch
- js学习笔记之包装对象
JavaScript包装对象 近日有时间,闲下来好好学习原生js JavaScript是一门面向对象语言,使用"."就可以访问对象的属性和方法,而基本类型(null, undefi ...
- ASP.NET通过http/https的POST方式,发送和接受XML文件内容
本文转载:http://hi.baidu.com/ysyhyt/item/5011ae39ce3cf49fb80c0395 本文参考:http://blog.csdn.net/ououou123456 ...
- Adobe Dreamweaver CS6安装步骤
dreamweaver cs6 下载地址: http://bbs.phonegap100.com/thread-135-1-1.html dreamweaver cs6 是世界顶级软件厂商adobe推 ...