0

我的代码有一些问题。我想我会在这个网站上与伟大的思想家分享我的问题,看看是否有人可以给我的大脑一些关于如何解决它的指示。

我正在开发一个应用程序(JQuery、PhoneGap)并且我有一个登录功能。登录功能将登录凭据发送到 Web 服务。所以我使用 JQUery ajax 发送它。该网络服务还包含一个 fetchData 函数,让我的客户端获取一些数据。网络服务将检查我当前是否已登录以及我的会话是否超时。如果超时,我需要再次登录。然后再试一次。这是用户永远不会看到的。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();
        }
    },
});
}
4

3 回答 3

2

异步函数不能(有用地)返回值

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

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

这应该对代码的(有效)现有使用没有任何影响,该代码当前不返回任何内容(实际上undefined)。

然后,您的第二个函数也可以注册对AJAX 调用error状态的兴趣:loginUser

error: function() {
    var loginPromise = loginUser();
    loginPromise.done(getData);
}
于 2012-09-05T14:27:54.507 回答
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 ot false。如果为真,则继续,否则向用户显示登录表单。

于 2012-09-05T14:36:06.873 回答
0

您可以进行非异步调用并让它的成功/错误处理程序在您的函数中设置一个局部变量(因为 ajax 只会在请求完成后返回)

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;
}
于 2012-09-06T10:24:54.570 回答