以下是代码:
$("#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>
我已经测试了这个函数的每个部分,它会准确地返回它应该是什么,所以我不相信这里有任何逻辑问题。我没有考虑将所有内容都放入回调函数中,但我会尝试。
答案 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})