【问题标题】:JQuery, ajax logic issueJQuery,ajax逻辑问题
【发布时间】:2012-09-05 12:46:28
【问题描述】:

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

我正在开发一个应用程序(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();
        }
    },
});
}

【问题讨论】:

  • 我该如何解决?阅读代码 cmets 以便您了解我需要它做什么。
  • 我认为这个问题可能会让你想到一些事情:stackoverflow.com/questions/6685249/….
  • @AlexanderTaran 不,进行同步 AJAX 调用几乎从来都不是正确的答案。

标签: jquery ajax mobile logic


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 看起来不错。但问题还有更多步骤。登录成功后,需要再次运行 getData。因此,如果登录返回 true,则需要再次运行 getData()。
  • aha...所以 getData ajax 错误会自动调用吗?但这不会造成无限循环吗?
  • @Juw 好吧,可能基于您给我们的信息。我怀疑你错过了一些步骤。你没有(例如)说它是否应该只重试一次登录。
  • 我想我可以通过使用简单的计数器变量或类似的东西来解决它。谢谢你的答案。我正在阅读延迟对象,这个解决方案似乎是要走的路。
【解决方案2】:
    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。如果为真,则继续,否则向用户显示登录表单。

【讨论】:

  • 无法使用它,因为我无法检查网络服务上的有效会话。
【解决方案3】:

您可以进行非异步调用并让它的成功/错误处理程序在您的函数中设置一个局部变量(因为 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;
}

【讨论】:

  • async: false 将在 JQuery 的下一个版本中删除。所以我不会用那个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多