【问题标题】:JQuery ajax function in a for loop is behaving weirdfor循环中的JQuery ajax函数表现得很奇怪
【发布时间】:2012-02-10 21:40:02
【问题描述】:

"get_ing_id" 获取一个字符串,查找数据库并根据字符串检索相关的id数据。在此示例中,它需要在代码执行时成功检索“65”和“66”。

var ings = [];
var ingsSearch = [];
var i = 2;
var k = 0;
ings[0] = 'apple';
ings[1] = 'banana';

    function next(){
        for(j=0;j<i;j++){
            if(ings[j] != 0){           
                $.ajax({
                    url: burl+'index.php/ajax/get_ing_id',
                    type: 'POST',   
                    data: 'name='+ings[j],
                    success: function(data){    
                        ingsSearch[k] = data;
                        alert(ingsSearch[k]);
                        k++;
                        alert(k);
                    }
                });                     
            }

        }   
    alert(ingsSearch[0]);
    alert(ingsSearch[1]);

    }

执行代码时,我会按顺序收到警报框:

  • 66
  • 1
  • 65
  • 2
  • 未定义
  • 未定义

应该是这样的

  • 66
  • 1
  • 65
  • 2
  • 66
  • 65

那么我哪里做错了?我对javascript不是很有经验,如果我得到任何帮助,我将不胜感激。感谢您的宝贵时间!

【问题讨论】:

    标签: php javascript jquery ajax codeigniter


    【解决方案1】:

    尝试将ajax 对象的async 属性设置为false。默认为true,因此无法保证调用将按顺序完成:

    $.ajax({
        async: false,
        // ..
    });
    

    请注意 ShankarSangoli 的评论;编写此代码的理想方式不是基于循环,而是从 AJAX 回调函数前进到下一个元素。

    【讨论】:

    • 该死的,这解决了一个完全不相关的问题,这个问题一直困扰着我。每天都在学习新东西(:
    • async 设置为 false 是不建议的,因为它会完全停止页面,直到服务器响应。尽量避免这种情况并使用回调机制。
    【解决方案2】:

    您必须了解 AJAX 默认情况下是异步的 - 服务器响应后立即调用成功函数,这很可能发生在调用两个 alert 语句之后;所以 lngsSearch[0] lngsSearch[1] 在您尝试输出它们时实际上并没有设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多