2012-10-31 51 views
0

问题:在Chrome中工作时,脚本未等待同步xhr响应。在FireFox/IE中正常工作。已经使用onreadyStateHandlers,但仍然在收到响应之前执行其他代码。XHR同步调用在Chrome中失败。不等待xhr响应的脚本

function callingScript() 
{ var a=callServer(); 
    alert(a);//Here a is showing undefined while executing in chrome. 
      But in FF/IE its waiting for the response and then alerts a with response. 
} 

function callServer() 
{ 
var response; 
var httpRequest = new XMLHttpRequest(); 
httpRequest.open("POST","abc",false); 
httpRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); 
httpRequest.onreadystatechange = function() 
    {  
     if (httpRequest.readyState != 4) 
      {return; } 

     if (httpRequest.status != 200)  
       {response=httpRequest.status;} 
     else {response=httpRequest.responseText;} 

    }; 
httpRequest.send(data); 
return response; 

} 

请分享您的想法!

+1

被告知:说你的问题是紧迫的是不会帮助你得到答案,可实际上把人们远离帮助您。 –

回答

1

函数callServer()不等待请求被响应。使用回调来解决这个问题:

function callingScript() 
{ callServer(function(response) { 
     alert(response); 
    }); 
} 

function callServer(callback) 
{ 
var response; 
var httpRequest = new XMLHttpRequest(); 
httpRequest.open("POST","abc",false); 
httpRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); 
httpRequest.onreadystatechange = function() 
    {  
     if (httpRequest.readyState != 4) 
      {return; } 

     if (httpRequest.status != 200)  
       {response=httpRequest.status;} 
     else {response=httpRequest.responseText;} 

     callback(response); 
    }; 
httpRequest.send(data); 
return response; 

} 
+0

谢谢Felix.Thanks的及时响应。所以无论我需要做什么东西的回应应该在callScript的回调函数的权利?这非常有用。非常感谢。 – Aki

+0

嗨,我正在执行$ http而不是xhr时遇到类似的情况。这次是为所有$ http请求创建一个通用服务。 $ http服务被注入到所需的控制器。现在,当控制器调用$ http服务时,它不会等待响应并执行下一步。虽然在后端我可以发生$ http连接。所以总之如何$ http同步调用或带回调函数。 – Aki