我的jQuery程序正在超越自己。我怎么阻止它?

时间:2010-10-20 17:58:15

标签: jquery

以下是代码:

$("#inputtxt").change(function() {

var doneflag = 0;
var testname = " "; 
var rawinput = $('#inputtxt').val();
var scnt = 0;
var indata = {};
$('#inputtxt2').val("");
$('#lnghost').show();
$('#lnghost2').hide();

// go load some arrays from data in a database  
getDBaseData(fnarray,lnarray,flarray);

//  Option 1:
//  $(function() {
//          setInterval("doneflag=1;", 5000);
//  });

//  Option 2:
//  while (doneflag == 0) {
//      t1 = setTimeout("doneflag = 1;",5000);
//      };

//  Option 3:
//      alert('Found 0 |'+fnarray[0] + '|' + lnarray[0]+'Found 1 |'+fnarray[1] + '|' + lnarray[1]+ ' doneflag is '+doneflag);

$.each(fnarray, function(i,val) { ... yada yada yada 

以下是发生的事情:
它应该工作,getDbaseData函数运行,从数据库获取数据,加载数组,然后返回并运行。相反,正在发生的事情是getDbaseData函数起飞,并且该程序继续运行,以便在填充数组之前访问.each函数。

在这两个陈述之间,我有3个选项评论说我已经尝试过了     - setInterval似乎没有做任何我能说的事情     - while循环无限运行
    - alert语句似乎可以使一切运行正常,即使它从数组中提取空字段。但似乎停止了足够长的时间让dbase调用赶上来。

当然我不想要警告声明。我做错了什么吗?有谁知道如何解决这一问题? 非常感谢帮助。

==========================更新================= =====
好的,我已经阅读了下面的答案,但有些人想看看getDbaseData函数,所以这里是:

<script type="text/javascript">
function getDBaseData(fnlist,lnlist,fllist) {
/* First call the php routine to get the database values, then process that info based on the following statements */
$.getJSON('getnames.php', {indata: $("#inputtxt").val() }, function (data) { 

    var newHTML = ' ';
    var doneflag = 'false';

    if (data[0].first == ' ') {
        fnlist[0] = 'none';
        lnlist[0] = 'none';
        fllist[0] = 'none';
        return false;
    };
            $.each(data,function(l, val) {
                  newHTML += '<li>' + data[l].first + ' ' + data[l].last + '</li>';
                  fnlist[l] = data[l].first;
                  lnlist[l] = data[l].last;
                  fllist[l] = 'hide';

            });
            $('#NameList').html(newHTML);  /* part of test code */
       });  /* end of getJSON call */
    };
 </script>

我已经测试了这个函数的每个部分,它会准确地返回它应该是什么,所以我不相信这里有任何逻辑问题。我没有考虑将所有内容都放入回调函数中,但我会尝试。

4 个答案:

答案 0 :(得分:1)

由于该函数正在进行异步调用,因此不会等待。但是,在这些ajax调用中确实有回调处理程序,并且可以将each函数放在那里,以便在填充数据后发生。

答案 1 :(得分:1)

执行此操作的常规方法是使用回调,即

getDBaseData(fnarray,lnarray,flarray, function() {
    // things to do once loaded
});

您的“getDBaseData”会有一个额外的参数,例如:

function getDBaseData(x, y, z, callback) {
    //...

    // when loaded... (see note below re async)
    if(callback) callback();
}

请注意,由于异步操作,“加载时”本身可能在$ .post或类似的回调中。

您可以(可选)将数据直接传递给回调。

答案 2 :(得分:0)

我看不到你的getDBaseData函数,但基本上你只需要在ajax查询成功后才能进入你的.each()循环。如果您正在使用jquery .ajax()方法,则可以将该代码放在success参数中。

答案 3 :(得分:-1)

我认为你可以在ajax调用中使用同步模式,

$ .ajax({url:“pagename ...”,async:false})