【问题标题】:setting a jquery ajax request to async = false doesn't work将 jquery ajax 请求设置为 async = false 不起作用
【发布时间】:2012-07-07 20:24:17
【问题描述】:

我正在尝试开始使用 google 钱包并通过 ajax 请求生成 jwt 令牌。

当用户点击购买按钮时,它会触发 purchase() 函数,然后使用 get_jwt_token_for_user() 函数发送一些数据以获取 jwt。我已将 ajax 请求设置为非异步,以确保将 jwt 发送到谷歌支付处理程序。

但是,在 get_jwt_token_for_user() 函数返回 jwt 之前,purchase() 函数似乎会继续。日志输出显示数字 1 和 2 在 jwt 从 get_jwt_token_for_user() 函数打印到控制台之前打印到控制台。

function get_jwt_token_for_user(the_key)
{
    var JwtTokenURL = "/get_jwt_token";
    var the_user_name = $('#user_name').val();
    var the_user_email = $('#user_email').val();
    var the_user_number = $('#user_number').val();
    $.ajax({ 
        type: "Get",
        url: JwtTokenURL,
        data: {user_number : the_user_number, user_name : the_user_name, user_email : the_user_email, the_d_key : the_key},
        async: false,
        success: function(result) {
            var myObject = JSON.parse(result);
            console.log(myObject.jwt_token);
            return myObject.jwt_token
        },
        failure: function(fail){ alert(fail); }
     });
}

function purchase(the_key)
{
    console.log("1");
    var jwt_token = get_jwt_token_for_user(the_key);
    console.log("2");
    if (jwt_token !== "")
    {
        console.log(jwt_token);
        goog.payments.inapp.buy({
            parameters: {},
            'jwt'     : jwt_token,
            'success' : successHandler,
            'failure' : failureHandler
          });
    }
}

知道在没有 jwt 值的情况下,我可以做些什么来确保 ajax 请求在 purchase() 函数继续前返回数据吗?

【问题讨论】:

  • 不确定这是否会解决异步问题,但您的 return 语句在成功处理程序中不会有任何好处。我认为在 $.ajax() 调用完成后你想要它,所以把它放在后面。否则,您的 get_jwt_token_for_user() 函数将始终返回 null。
  • 重构你的代码,让你想要执行的代码进入回调;)
  • 有点困惑 - 从我所见,您发布的代码中实际上没有调用 purchase 函数,即没有调用它。

标签: javascript ajax jquery


【解决方案1】:

你的get_jwt_token_for_user 函数没有返回任何东西,你需要更多类似的东西:

function get_jwt_token_for_user(the_key) {
    //...
    var myObject;
    $.ajax({ 
        //...
        success: function(result) {
            myObject = JSON.parse(result);
        },
        //...
     });
     return myObject ? myObject.jwt_token : '';
}

从您的 success 回调中返回某些内容不会导致该值被 $.ajax 返回,并且 JavaScript 函数不会返回它们最后一个表达式的值,您必须 如果您希望函数返回某些内容,请包含明确的 return

你也应该尽快停止使用async:false,它对用户很不利,而且it is going away。您的代码应该看起来更像这样:

function get_jwt_token_for_user(the_key, callback) {
    //...
    $.ajax({ 
        type: "Get",
        url: JwtTokenURL,
        data: {user_number : the_user_number, user_name : the_user_name, user_email : the_user_email, the_d_key : the_key},
        success: function(result) {
            var myObject = JSON.parse(result);
            callback(myObject.jwt_token);
        },
        failure: function(fail){ alert(fail); }
     });
}

function purchase(the_key) {
    get_jwt_token_for_user(the_key, function(jwt_token) {
        if (jwt_token !== "") {
            //...
        }
    });
}

【讨论】:

  • 不可以使用function(){ $.ajax({...})},用匿名函数包装ajax吗?
  • @SheikhHeera: 没有return 语句意味着没有返回值和$.ajax always returns a jqXHR object
  • 你能看看this接受的答案吗?
  • 很棒的家伙 - 完美地解决了这个问题。我也会听取你关于 async = false 提示的建议。
  • @SheikhHeera:(1) 这个答案很古老,jQuery 界面已经改变。 (2) 该问答中success处理程序的返回值将被忽略。 (3) 匿名点击处理函数不返回任何内容。
猜你喜欢
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
相关资源
最近更新 更多