首页 新闻 会员 周边

for循环中的post如何正确传递循环变量?

0
悬赏园豆:20 [已解决问题] 解决于 2016-10-07 15:02

功能:第一个选择框做了选择,子选择框的选项会做相应的筛选。

方法:把相关的选择框id和post URL放在数组里,然后遍历去做更新。

问题:因为是异步的,等第一个post做完以后for循环已经做完了,i永远是最后的值,请问如何控制每个post都能得到对应的i?

或者应该用别的方法来实现?求指点,多谢。

 

选择框用了multipleSelect插件

代码如下:

复制代码
 for (i = 0; i < nextID.length; i++) {
                    $.post(nextURL[i].toString(),
                        {
                            ID: $("#sel_ta").multipleSelect("getSelects").toString()
                        })
                       .then(
                    function (data) {
                        cID = $(String(nextID[i]));
                        var html = [];
                        $.each(data, function (d, data) {
                            html.push('<option value="' + data.id + '">' + data.text + '</option>');
                        });
                        cID.html(html.join('')).multipleSelect();
                    });
                }
复制代码
问题补充:

网上查了一下“立即执行的匿名函数”可以正确的传i的值,但是不知道怎么传post得到的data。

moiam的主页 moiam | 初学一级 | 园豆:136
提问于:2016-10-04 10:11
< >
分享
最佳答案
1

经典的闭包问题,在var z = 0;上面,加上一句var a=i;后面的i都用a代替。

收获园豆:20
ensleep | 小虾三级 |园豆:1682 | 2016-10-04 10:52

刚刚试了一下,a始终是最后一个i的值。

moiam | 园豆:136 (初学一级) | 2016-10-04 10:58

@moiam: 不好意思,昨天我没有试,按C#里面的写了,JS里面你可以试一下写成传参的方式。给你一个我写的Demo:

 for(var i=0;i<10;i++){setTimeout(function(a){console.info(a);},i);}

也就是说,你把你里面的操作写成一个function,然后这个functioni作为参数,就可以了,传参的时候js里面才是传值 ,其它的闭包可能无论怎么调都是传址。

 

 1 for (i = 0; i < nextID.length; i++) {
 2   Send(i);
 3 }
 4 function Send(i){
 5     $.post(nextURL[i].toString(),
 6         {
 7             ID: $("#sel_ta").multipleSelect("getSelects").toString()
 8         })
 9        .then(
10     function (data) {
11         cID = $(String(nextID[i]));
12         var html = [];
13         $.each(data, function (d, data) {
14             html.push('<option value="' + data.id + '">' + data.text + '</option>');
15         });
16         cID.html(html.join('')).multipleSelect();
17     });
18 }

 试一下,如果不行,可能得传形参放在post里面而不是外面,你先试一下。

ensleep | 园豆:1682 (小虾三级) | 2016-10-05 12:10

@ensleep: 太感谢了!完美解决问题!谢谢!

moiam | 园豆:136 (初学一级) | 2016-10-07 15:02
其他回答(1)
1

ajax就是这样的,类似i这样变化的值,需要从返回的data中获取.

也就是说,你要先传到服务器,再从服务器传回来.,

crow0176 | 园豆:247 (菜鸟二级) | 2016-10-06 11:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册