js中,for循环里面放ajax,ajax访问不到变量以及每次循环获取不到数据问题总结

首先晒下自己代码

for ( var i = 0; i < rows.length; i++) {

        $.ajax({
            type:‘POST‘,
            url:‘${ctx }/admin/store_item/findStoreItemsByType?typeid=‘ +flag+‘&id=‘+rows[i].id,//请求的url地址
            async: false,//设置成同步
            dataType:‘json‘,
            success:function(data){
                 if(flag==1){

                    $(‘#chexingtable‘).datagrid(‘updateRow‘,{
                        index:i,
                        row:{price:data.price1,sumprice:data.price1*data.bz_gs}
                    });

                }else if(flag==2){

                    $(‘#chexingtable‘).datagrid(‘updateRow‘,{
                        index:i,
                        row:{price:data.price2,sumprice:data.price2*data.bz_gs}
                    });
                }else if(flag==3){

                    $(‘#chexingtable‘).datagrid(‘updateRow‘,{
                        index:i,
                        row:{price:data.price3,sumprice:data.price3*data.bz_gs}
                    });

                }else if(flag==4){
                    $(‘#chexingtable‘).datagrid(‘updateRow‘,{
                        index:i,
                        row:{price:data.price4,sumprice:data.price4*data.bz_gs}
                    });
                } 

            }
    });

    }

刚开始的时候,每次循环是获取不到ajax中的值的,在ajax中,如果想获取到变量I,那么也是有问题了。

解决了半小时,终于明白了问题的所在:

for 循环是一个单线程的东西,而ajax是多线程的,之所以称之为异步同步,是因为执行到ajax的时候去后台开启了一个线程,但是for循环本身就是一个单线程的东西,那么执行到ajax的时候,ajax开启了一个线程,for

循环是没有等他的,知道for循环结束的时候,才会把ajax返回的数据拿回来,所以会出问题

解决办法:只需要把ajax改成同步的就可以了,每次for循环,都要去加载ajax方法,并且拿到他返回的数据,只需要在ajax中间加一个代码就可以搞定了。async: false,//设置成同步

时间: 2024-12-07 00:47:46

js中,for循环里面放ajax,ajax访问不到变量以及每次循环获取不到数据问题总结的相关文章

JS中事件的执行顺序和AJAX的异步

之前了解过异步和同步,知道同步是顺序执行,异步是同时执行,但是没有遇到过这种情况,不是很理解,这两天做项目突然遇到了,对这有了一个初步的认识.废话不多说,直接上要求. 1.项目要求:外部调用xml文件,然后JS动态生成下拉菜单,使多个文件同时使用此菜单,方便维护. 如图,下面白色为以前的菜单,但是多个地图都需要写同样的菜单比较麻烦,也不好修改,所以做一个xml文件,存储菜单内容,然后多个地图调用,容易修改,蓝色部分菜单. 2.项目代码:此处我使用的Jquery addMenu(){ $.ajax

ajax post 请求 ,java端使用 request.getParameter 获取不到数据问题

js端 $.ajax({ type:'POST', data:{a:1}, url:_this.apiUrl+url, dataType:'json',//使用jsonp方式请求 contentType:"application/json; charset=utf-8", json:"callback",//jsonp名 success:function(re){ }}); @PostMapping(value = "/queryProduct"

js中的4种循环结构

js有4种循环结构: 1.for循环 ==>多次遍历代码块 2.for / in循环==>遍历对象属性 3.while循环==>当指定条件为true时,循环代码块 4.do while循环==>当指定条件为true时,循环代码块 for循环 一般都有特定的计数器变量.操作计数器的三个重要步骤为:初始化.检测.更新 语句1的作用是将变量初始化: 语句2的作用是在每次循环前都要检测变量的值是否在某一个范围内: 语句3的作用是更新计数器变量:每次循环后进行自增或者自减操作 for(语句1

JS中的闭包(closure)

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.下面就是我的学习笔记,对于Javascript初学者应该是很有用的. 一.什么是闭包 JS中,在函数内部可以读取函数外部的变量 function outer(){ var localVal = 30; return localVal; } outer();//30 但,在函数外部自然无法读取函数内的局部变量 function outer(){ var localVal = 30; } aler

js中如何返回一个存放对象的数组?

我这边需要返回后台数据的形式是这样的 {[ { "ItemId": "18", "SelectId": 2 }, { "ItemId": "19", "SelectId": 1 }, { "ItemId": "20", "SelectId": 1 }, { "ItemId": "21",

js中如何将字符串转化为时间,并计算时间差

在前台页面开发时通常会用到计算两个时间的时间差,先在此附上实现方法 [javascript] view plain copy //结束时间 end_str = ("2014-01-01 10:15:00").replace(/-/g,"/");//一般得到的时间的格式都是:yyyy-MM-dd hh24:mi:ss,所以我就用了这个做例子,是/的格式,就不用replace了. var end_date = new Date(end_str);//将字符串转化为时间

JS中的嵌套作用域

在JS中仅仅区分全局变量和局部变量还不够,实际上,变量作用域可以有任意层级(嵌套).其他函数内部定义的函数可以调用父函数的局部变量,而内部函数里定义的函数则不仅可以调用父函数的局部变量,还可以调用祖父函数的局部变量. //定义一个函数接收正数number,然后将其和参数factor相乘 function multiplyAbsolute(number,factor){ function multiply(number){ return number*factor; } if (number<0)

js中常见的数据类型

js中常见的数据类型分为两种:基本数据类型.复杂数据类型. 基本数据类型把数据名和值直接存储在栈中. 复杂数据类型在栈中存储数据名和一个堆的地址,在堆中存储属性及值.访问时先从栈获取地址, 再到堆中拿出相应的值 总结:基本数据类型复制的是值,复杂数据类型复制的是引用地址. 为什么划分数据类型? 计算机为了更方便的对内存进行管理,对不同的数据,做了类型上的划分. 如何查看一个变量的数据类型? 使用typeof命名 例如: var x = 5; var res typeof x; 变量的数据类型有

js 中采用词法作用域

所谓的 词法( 代码 )作用域, 就是代码在编写过程中体现出来的作用范围. 代码一旦写好, 不用执行, 作用范围就已经确定好了. 这个就是所谓词法作用域. 在 js 中词法作用域规则: 1.函数允许访问函数外的数据. 2.整个代码结构中只有函数可以限定作用域. 3.作用规则首先使用提升规则分析. 4.如果当前作用规则中有名字了, 就不考虑外面的名字. 在编译语言中,**通常** 代码在被引擎执行之前会经历三个步骤: 1. 词法分析(tokenzing/lexing)2. 解析/语法分析(pars