各位好,我正在写个简单的Javascript程序,主要过程就是在html页面中调用include进来的Js文件中的一个函数。该函数访问某网站的一个php,传个参数给它,然后返回需要的Json数据。我现在的代码类似这样,1. html页面中,getData();if(dataLists.length!=0){}........2. 被包含的js中getData()代码,基本结构如下,为简单,请忽略语法。var c = new httpRequest();
c.open('GET', 'http://xxxxxx/getData.php?user='+user);
c.onreadystatechange = function() { if(c.readystate==4){
dataLists.push(this.responseText);
}}
c.send(null);
.........3. 运行结果:
c的状态还没有到4,getData就返回了,导致html页面在调用该函数后面的代码dataLists为空,没有实现目的。我觉得是同步异步的问题,查询了一下,说c.open()的第三个参数设置为false即可实现同步,默认是异步的。但是,由于我们采用的httpRequest是自己外面另包了一层的方法,据开发者说他短期内不打算实现false这个参数的功能。请问,我这种情况是不是由于同步异步出现的问题?如果同步支持暂时无法实现,在异步的情况下,如何让c.readystate==4后再返回使得数据能够在HTML中取到(现在在JS中是没问题的,通过log发现可以取到php返回数据)?我是一个初学者,可能有概念错误和理解误区,请各位多指教。非常感谢。分数有限,因为头一次发。
c.open('GET', 'http://xxxxxx/getData.php?user='+user);
c.onreadystatechange = function() { if(c.readystate==4){
dataLists.push(this.responseText);
}}
c.send(null);
.........3. 运行结果:
c的状态还没有到4,getData就返回了,导致html页面在调用该函数后面的代码dataLists为空,没有实现目的。我觉得是同步异步的问题,查询了一下,说c.open()的第三个参数设置为false即可实现同步,默认是异步的。但是,由于我们采用的httpRequest是自己外面另包了一层的方法,据开发者说他短期内不打算实现false这个参数的功能。请问,我这种情况是不是由于同步异步出现的问题?如果同步支持暂时无法实现,在异步的情况下,如何让c.readystate==4后再返回使得数据能够在HTML中取到(现在在JS中是没问题的,通过log发现可以取到php返回数据)?我是一个初学者,可能有概念错误和理解误区,请各位多指教。非常感谢。分数有限,因为头一次发。
就你的情况来说,是异步问题,如果不能改成同步,那就只能用个定时器,隔段时间判断一下dataLists是否已经被push了。没有push就急速等,有了,程序往下执行
if(tableData.length==0){}
else{
intx = clearInterval(intx);
}
});
但程序还是会在interval之间继续进行,我该如何写这个判断呢?to Inpool:恩,明白了,确实是这个问题,多谢。
dataLists.push(this.responseText);
}
这里的语句说明如果readystate等于4 的话,dataLists不可能为空的。
如果为空那可能就是PHP那边给你的数据,即responseText就是空的。
跟同步、异步没有什么关系吧。
---------------------------
你这样是死循环,由于js是单线程的,别人无法插一脚进来,每次check完变量状态,要把执行权力返还给系统。Checker(){
if(dataLists.length==0){
//做事儿
}else{
setTimeout(Checker,1000); //如果没有到状态就隔开一秒调用自己一次,并让系统工作
}
}
setTimeout(Checker,1000);下次开贴,如果麻烦就多放点分,这里都人都吃放滴,否则就整个美女头像。
c.open('GET', 'http://xxxxxx/getData.php?user='+user);
c.onreadystatechange = function() { if(c.readystate==4){
dataLists.push(this.responseText);
if(dataLists.length!=0){} ........
}}
c.send(null);
......... 用这个方式