这感觉就像一个相当noob的问题,但是到底是什么。我正坐在PhoneGap项目中并遇到一些问题。 我按照ajax(http://wiki.phonegap.com/w/page/42450600/PhoneGap%20Ajax%20Sample)的小型twitterfeed教程,它就像一个魅力。但是,我正在编写一个用于登录,注销等等的小型API,我几乎可以使用它。
我会解释我的问题: 我设置了一个BOOL变量,“b”,用于确定用户是否登录。
var b = Do_Ajax('isloggedin');
并且该函数看起来几乎完全如下:
function Do_Ajax(what)
{
var ajax = new XMLHttpRequest();
if(what == "isloggedin")
{
ajax.open("GET", root() + "/?isloggedin",true);
ajax.send();
}
//Get the results back
ajax.onreadystatechange=function()
{
if(ajax.readyState==4 && (ajax.status==200||ajax.status==0))
{
eval('var data = ' + ajax.responseText + ';');
var theResults = data.results;
if(data['BOOL'] != null )
{
return data['BOOL'];
}
}
}
}
如果我现在尝试对此变量(b)发出警报,我会得到“未定义”。如果我将“return”更改为“alert”(其中我打印“return data ['BOOL'];” - php返回一个json字符串)我将获得true或false值。如果我然后在函数中对b变量AND发出警报 - b变量首先发出警报,然后数据['BOOL']发出警报。
所以问题是函数在获取数据之前返回undefined。如何使函数“等待”返回此值,直到它运行onreadystatechange东西?
编辑:解决它的一种方法是在函数外部声明一个变量,例如“var IsUserOnline = false;”然后在函数中当它完成请求时设置“IsUserOnline = data ['BOOL']:”并且稍后在代码中使用这个变量。但是,不,我认为回归思维会是最好的。我认为将来通过此功能获取/发布更多内容时,我的代码会非常混乱。也许这只是我认为现在真的错了?
答案 0 :(得分:1)
您可以在onreadystatechange函数中调用该函数。
在您的代码中(请参阅我添加的评论):
function Do_Ajax(what)
{
var ajax = new XMLHttpRequest();
//Get the results back
ajax.onreadystatechange=function()
{
if(ajax.readyState==4 && (ajax.status==200||ajax.status==0))
{
eval('var data = ' + ajax.responseText + ';');
var theResults = data.results;
if(data['BOOL'] != null )
{
return data['BOOL'];
}
//CALL YOUR FUNCTION HERE,
//OR THE CODE WHAT NEEDS TO HAPPEN AFTER A VALUE HAS BEEN RECEIVED
//BY THE AJAX REQUEST
}
}
if(what == "isloggedin")
{
ajax.open("GET", root() + "/?isloggedin",true);
ajax.send();
}
}
答案 1 :(得分:0)
如果我理解正确您正在尝试调用同步ajax调用,但给定的函数仍然使用异步方式,因此您将无法接收正确的数据。尝试jQuery AJAX promise函数,它可以帮助你调用ajax请求是同步模式。
http://www.erichynds.com/jquery/using-deferreds-in-jquery/
http://intridea.com/posts/fun-with-jquery-deferred
如果您不使用jQuery,则可能需要在callback
之后添加what
参数,并在响应处理时调用回调。