2014-07-05 70 views
-1

我想从一个网络服务器获取数据,它必须由不同的功能处理,直到显示出来。我的问题是,当xmlhttprequest是异步的,那么处理函数已经被调用,但数据不可用。我如何确保异步调用完成? 我知道readyState和状态属性。如果响应需要更长时间,则同步呼叫无助于冻结浏览器。我只能使用纯JavaScript,处理数据的函数只能稍微改变。如何确保Xmlhttprequest(异步)完成?

编辑:

以下结构是我的问题(抽象,在现实中多个不同版本的情况发生了):

  • 功能loadData:不会的XMLHttpRequest(异步)
  • 功能A:调用loadData ,先调用
  • 函数B:调用loadData,调用第二个
  • 函数C:调用A和D以及第一个调用
  • 功能d:第一执行一些计算
  • 功能:显示HTML元素基于输入
  • 功能秒:显示其他HTML元素

实施例的程序运行:

  • JS自动调用功能A显示图表
  • 用户按下按钮并调用功能B,显示不同的图表
  • 用户按下不同的按钮调用函数C

问题:(?这可能是由新的参数来识别) 在功能上,功能首先需要的数据,但不能从loadData的onreadystatechange因为有几个不同的上下文中被调用例如函数B的调用。

我认为只有通过更改onreadystatechange中loadData和条件语句的新参数的结构才能实现,然后onreadystatechange会调用需要来自Web服务器的不同函数。不幸的是,在调用另一个函数之前,将包括部分计算或完成的工作(来自函数A,B,C)。这基本上打破了逻辑分离。 是否有任何其他方式在现有代码中需要更少的更改?

回答

0

所有的处理功能必须在XHR对象的onreadystatechange方法中执行。

xmlhttp.onreadystatechange=function() { 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) { 
    //all your processing depending on your response (xmlhttp.responseText) must happen here 
    } 
} 
+0

这当然有效。但是一个特定的功能非常棘手。它被在不同情况下调用的几个函数使用。因为我认为没有简单的解决方案,但建立了不同的结构 – John

+0

虽然你的回答是正确的,但我想看看在接受之前是否有其他方式可能会有人知道。我不能投票你的答案,因为我没有足够的声誉。 – John

0

像以下:

var ajax = new XMLHttpRequest(); 
ajax.open("GET","link.php?a=a"); 
ajax.send(); 
ajax.onreadystatechange = function() { 
    if (ajax.readyState != 4 || ajax.status != 200) return; // data is available from next line 
     alert(ajax.responseText); 
};