这是我在javascript中使用的三个函数:
function postRequest()
{
var xmlHttp;
if(window.XMLHttpRequest)
{ // For Mozilla, Safari, ...
var xmlHttp = new XMLHttpRequest();
}
else if(window.ActiveXObject)
{ // For Internet Explorer
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlHttp.open('GET', 'effort.php', true);
xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xmlHttp.onreadystatechange = function()
{
if (xmlHttp.readyState == 4)
{
get_string(xmlHttp.responseText);
dij();
}
}
xmlHttp.send(null);
}
function get_string(str)
{
get_integer = str.split(" ");
for(var i=0;i<214;i++)
{
vertex_i[j] = get_integer[i]*1;
j++;
}
j=0;
for(var i=214;i<427;i++)
{
vertex_f[j] = get_integer[i]*1;
j++;
}
j=0;;
for(var i=427;i<517;i++)
{
x[j] = get_integer[i]*1;
j++;
}
j=0;
for(var i=517;i<607;i++)
{
y[j] = get_integer[i]*1;
j++;
}
for(var m=0;m<90;m++)
{
for(var n=0;n<90;n++)
{
L[m][n] = -1;
}
}
for(var m=0;m<212;m++)
{
x1 = x[vertex_i[m]];
x2 = x[vertex_f[m]];
y1 = y[vertex_i[m]];
y2 = y[vertex_f[m]];
L[vertex_i[m]][vertex_f[m]] = parseInt(find_dist(x1,x2,y1,y2));
}
}
function point_it(event)
{
postRequest();
}
即:
point_it(event)
,然后是postRequest();
,最后是dij();
在这些函数中,我使用三个全局定义数组中的数据,其元素派生自服务器发送的数据(get_string函数)。
如果我从dij()
函数中调用postRequest()
函数(在get_string函数之后我能够访问数组中的正确数据。
但是如果我在postRequest()
函数之后立即调用它,则数组中元素的值将变为null。
我无法理解这个的正当理由,并尝试了几种方法来通过但没有进展。
CAn sm1请帮帮我!
答案 0 :(得分:0)
postRequest
向服务器发出异步请求。在它之后直接调用函数并不意味着请求已经完成,并且您已经对响应数据做了任何事情。它在postRequest
内部工作,因为您实际处理请求和响应的位置。
如果您想从内到外完成所有这一点,我建议您执行以下操作:
function postRequest(callback)
{
var callbackFunc = callback||null;
var xmlHttp;
if(window.XMLHttpRequest)
{ // For Mozilla, Safari, ...
var xmlHttp = new XMLHttpRequest();
}
else if(window.ActiveXObject)
{ // For Internet Explorer
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlHttp.open('GET', 'effort.php', true);
xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xmlHttp.onreadystatechange = function()
{
if (xmlHttp.readyState == 4)
{
get_string(xmlHttp.responseText);
if(callbackFunc){
callbackFunc();
}
}
}
xmlHttp.send(null);
}
function point_it(event)
{
postRequest(dij);
}
这允许您改变使用由post请求填充的数组的回调,以及在请求周期完成后它总是触发的回调。
答案 1 :(得分:0)
XMLHttpRequest
异步。
这意味着,只要请求发送,它就会立即返回。如果您现在致电dij()
,请求仍然会待处理,并且尚未调用get_string
。
请求完成后,将立即调用回调,然后执行get_string
。
您还需要将dij()
留在回调中。
目视:
postRequest
已设置,设置回调,但不执行回复,postRequest
然后返回postRequest
后执行的代码XMLHttpRequest
最终完成并执行回调,现在调用get_string
答案 2 :(得分:0)
全局变量不是一个好习惯。最好将get_string和dij函数合并为一个,将数组作为单个函数内的局部变量。