各位好,我正在写个简单的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返回数据)?我是一个初学者,可能有概念错误和理解误区,请各位多指教。非常感谢。分数有限,因为头一次发。

解决方案 »

  1.   

    比较无聊,这么简单的功能,对方有什么不能立刻实现的。
    就你的情况来说,是异步问题,如果不能改成同步,那就只能用个定时器,隔段时间判断一下dataLists是否已经被push了。没有push就急速等,有了,程序往下执行
      

  2.   

    getData()的任务就是开一个Ajax线程,然后程序继续往下走,你这里运行一个语句的速度当然比从服务器取数据快,所以你总你的if语句基本上永远是false。
      

  3.   

    啊,多谢各位的指点。to eduyu:我现在在html页面中加入了 var intx = setInterval(function(){
       if(tableData.length==0){}
       else{
       intx = clearInterval(intx);
       }
       });
    但程序还是会在interval之间继续进行,我该如何写这个判断呢?to Inpool:恩,明白了,确实是这个问题,多谢。
      

  4.   

    setTimeout和setInterval跟上面的一样,是新开进程的,用while循环。
      

  5.   

       if(c.readystate==4){ 
              dataLists.push(this.responseText); 
        }
    这里的语句说明如果readystate等于4 的话,dataLists不可能为空的。
    如果为空那可能就是PHP那边给你的数据,即responseText就是空的。
    跟同步、异步没有什么关系吧。
      

  6.   

    Inpool说得很对,setInterval是新开线程的。
      

  7.   

    不会新开线程的,甚至进程,这样违反了js目前是单线程的这个事实。这也就是为什么js代码太过火,UI会阻塞的原因。概念上应该理解为软中断,和cpu工作原理一样,timeout来了,现行的执行代码会被中断,去执行timeout内的代码,timeout内代码执行完了,回过头来继续执行中断处的代码。
      

  8.   

    我试验了do{}while(dataLists.length==0),但UI就停留在那里了,貌似dataLists总取不到,奇怪。
      

  9.   

    我试验了do{}while(dataLists.length==0),但UI就停留在那里了,貌似dataLists总取不到,奇怪。
    ---------------------------
    你这样是死循环,由于js是单线程的,别人无法插一脚进来,每次check完变量状态,要把执行权力返还给系统。Checker(){
    if(dataLists.length==0){
    //做事儿
    }else{
    setTimeout(Checker,1000); //如果没有到状态就隔开一秒调用自己一次,并让系统工作
    }
    }
    setTimeout(Checker,1000);下次开贴,如果麻烦就多放点分,这里都人都吃放滴,否则就整个美女头像。
      

  10.   

    var c = new httpRequest();
    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);
    ......... 用这个方式