在学习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)的更多相关文章

  1. 循环内部嵌套ajax请求

    循环内部ajax请求涉及到循环变量的取值问题: 例如: for(var i=0; i<items.length; i++){ zzurl = items[i].url; $.ajax({ typ ...

  2. For循环中由于ajax异步导致的问题解决(增加alert数据正常,去掉alert之后数据错误)

    由于ajax异步请求的机制,for循环运行不会等内部ajax请求结束,而直接循环到最后.解决方法:将for循环里面的请求单独封装一个方法. 个人遇到的问题具体如下 下面这段代码,如果第5行studat ...

  3. 如何处理ajax中嵌套一个ajax

    在做项目的时候 遇到过第二次了 当我第二次去问'公子'的时候 被吐槽了 原来我以前遇到过 只是忘记了...他老人家竟然还记得... ajax由于他的异步特性 在第一次请求中的循环中嵌套第二个ajax会 ...

  4. Django中的Ajax

    Ajax 很多时候,我们在网页上请求操作时,不需要刷新页面.实现这种功能的技术就要Ajax!(本人定义,不可迷信) jQuery中的ajax就可以实现不刷新页面就能向后台请求或提交数据的功能,我们仍然 ...

  5. ajax嵌套ajax 可能出现问题 的解决办法

    ajax由于他的异步特性 在第一次请求中的循环中嵌套第二个ajax会数据会读不出来 第一种 描述:如果条件许可,把两次请求都放在服务端处理掉一起发回来,这些就在客户端只有一次ajax了 优点:代码放在 ...

  6. php安装soap等扩展的方式: 已经安装了php却发现少安装了一下扩展

    php安装soap等扩展的方式: 已经安装了php却发现少安装了一下扩展 1.首先确认下php.ini的安装位置 我的安装目录是: /usr/local/php 一般位置: /usr/local/ph ...

  7. jQuery中的Ajax几种请求方式

    1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中. url (String) : 请求的HTML页的URL地址. data (M ...

  8. ThinkPHP中使用ajax接收json数据的方法

    本文实例讲述了ThinkPHP中使用ajax接收json数据的方法.分享给大家供大家参考.具体分析如下: 这里通过ThinkPHP+jquery实现ajax,扩展了下,写了个查询,前台代码如下: 首先 ...

  9. jQuery中的ajax使用详解

    $.ajax({   type : "get",   url : "http://www.w3school.com.cn/jquery/ajax_ajax.asp&quo ...

随机推荐

  1. 14.5.5.3 How to Minimize and Handle Deadlocks 如何减少和处理死锁

    14.5.5.3 How to Minimize and Handle Deadlocks 如何减少和处理死锁 这个部分建立在概念信息关于deadlocks 在章节 14.5.5.2, "D ...

  2. Android开发详解之onTouch和onClick详解

    android组件中的onTouch,onClick,onLongClick事件发生先后顺序和关联: 一,onTouch返回false 首先是onTouch事件的down事件发生,此时,如果长按,触发 ...

  3. SQL Server 阻塞分析

    一.加锁(locking).阻塞(blocking).死锁(deadlock)定义        加锁:用于管理多个连接的进程.当连接需要访问一块数据时,在这些数据上放置某种类型的锁.      阻塞 ...

  4. 协定类型不具有 ServiceContractAttribute 特性

    协定类型 ZBMService.QueryHistoryData 不具有 ServiceContractAttribute 特性.若要定义有效协定,指定的类型(协定接口或服务类)必须具有 Servic ...

  5. KK的新书《必然》对未来科技趋势的预言

    是他第一次在<失控>中提示我们--  要用生物学而不是机械学的角度看待这个世界.  是他第一次在<科技想要什么>提示我们--  科技本身就是一个生命体.  而在新书<必然 ...

  6. [转]33 useful Keyboard Shortcuts for Run commond

    原文: http://www.shortcutworld.com/en/win/Run-command.html 1. Calling Run CommandWin + r               ...

  7. Linux学习笔记6——映射虚拟内存

    使用到两个函数mmap:用于分配内存:munmap:用于释放内存. mmap的原型如下: void *mmap(    void *start,   //指定映射的虚拟地址 0由系统指定开始位置    ...

  8. openStack 瓶颈测试

  9. Digital Root - SGU 118(高精度运算)

    题目大意:有K组测试数据,然后每组有N个正整数,A1,A2,A3.....An,求出 A1 + A1*A2 + A1*A2*A3 + .......A1*A2*...An 的数根. 分析:有个对9取余 ...

  10. Java中的一些常见错误

    1.空指针错误 在java数组的使用中,有时候需要对字符串数组中的元素进行对比.那么当元素不为null时,程序会正常运行:然而,一旦对比的元素为null,那么程序就会出现空指针错误. 解决方法:加入保 ...