4

我正在尝试开始使用谷歌钱包并通过 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
          });
    }
}

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

4

1 回答 1

5

你的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你也应该尽快停止使用,它对用户很不利,而且它正在消失。您的代码应该看起来更像这样:

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 !== "") {
            //...
        }
    });
}
于 2012-07-07T20:10:29.080 回答