2012-09-05 100 views
0

我的代码存在一些问题。而且我想我会分享我的问题与这个网站的伟大头脑,看看有人可以给我的大脑一些指示如何解决它。JQuery,ajax逻辑问题

我正在开发一个应用程序(JQuery,PhoneGap),我有一个登录函数。登录功能将登录凭证发送到Web服务。所以我使用JQUery ajax发送它。 Web服务还包含一个fetchData函数,让我的客户端可以获取一些数据。 web服务将检查我是否正在登录,并且我的会话没有超时。如果它有超时我需要再次登录。然后再试一次。这是用户永远不会看到的东西。 loginUser()是一个在我的代码中多次使用的函数。所以我不想摆弄它,所以我不得不做很多改变。

因此,这里是一些伪代码:

function loginUser() 
{ 
$.ajax(
{ 
    .... 
    success: function(data,status) 
    { 
     //everything worked great 
     return true; 
    }, 
    error: function(data,status) 
    { 
     //display some user error stuff. 
     return false; 
    }, 
}); 
} 

function getData() 
{ 
$.ajax(
{ 
    ... 
    success: function(data,status) 
    { 
     //everything worked great. No need to login user again. 
    }, 
    error: function(data,status) 
    { 
     //Opps user needs to login again and then we need to try again. 
    //If we have tried to getData after we tried to login (and got succeess from the loginUser() function)....report error. 
     //Below code will not work. But it will show you roughly what i am trying to do. It will also create an infinite loop. 
     if (loginUser()) 
     { 
      getData(); 
     } 
    }, 
}); 
} 
+1

和问题是什么? – Pluda

+0

我该如何解决它?阅读代码评论,以便了解我需要做什么。 – Juw

+0

我想这个问题可能会导致你的东西: http://stackoverflow.com/questions/6685249/jquery-performing-synchronous-ajax-requests。 –

回答

2

异步功能不能(有效)返回一个值

首先,更改loginUser使其返回jqXHR对象:

function loginUser() { 
    return $.ajax(...); 
} 

这应该做出的(有效)现有的代码,目前没有返回值(实际上undefined)的用途没有区别。

那么你的第二个error功能也登记在loginUser AJAX调用的状态感兴趣:

error: function() { 
    var loginPromise = loginUser(); 
    loginPromise.done(getData); 
} 
+0

看起来不错。但问题有更多的步骤。登录成功后,需要再次运行getData。所以如果登录返回true,getData()需要再次运行。 – Juw

+0

@Juw这就是'loginPromise.done(getData)'行所做的。 – Alnitak

+0

aha ...所以getData ajax错误会自动调用?但是不会创造一个无限循环吗? – Juw

0
var user_id, has_valid_session; 
    function check_session() { 
     $.ajax({ 
     type: "POST", 
     url: "login.php", 
     data: "{user:user_id}", 
     success: function(result) { 
      // you send to your server the user_id and make sure he has a valid session 
      if(result == "true") { 
       has_valid_session = true; 
       continue(); 
      } else { 
       $('#error').html("you need to login first"); 
       login_user(); 
      } 
     } 
    }); 
} 

如果我理解你的问题,你需要加载服务器端脚本PHP/ASP和等待结果,在我的例子中结果将是真实的。如果为true,则继续向用户显示登录表单。

+0

不能使用这个,因为我无法检查Web服务上的有效会话。 – Juw

0

可以使一个非异步调用,并有它的成功/错误处理程序,在您的功能设置局部变量(因为AJAX将只返回请求finised后)

function loginUser() 
{ 
    var result = false; 
    $.ajax(
    { 
    .... 
    async: false, 
    success: function(data,status) 
    { 
     //everything worked great 
     result = true; 
    }, 
    error: function(data,status) 
    { 
     //display some user error stuff. 
     result = false; 
    }, 
    }); 
    return result; 
} 
+1

async:false将在下一个JQuery版本中被删除。所以我不会使用它。 – Juw