Javascript 将jquery ajax请求设置为async=false不会';行不通

Javascript 将jquery ajax请求设置为async=false不会';行不通,javascript,ajax,jquery,Javascript,Ajax,Jquery,我试图开始使用谷歌钱包,并通过ajax请求生成jwt令牌 当用户点击purchase按钮时,它启动purchase()函数,该函数使用get_jwt_token_for_user()函数发送一些数据以获取jwt。我已经将ajax请求设置为非异步,以确保jwt被发送到google支付处理程序 但是,在get_jwt_token_for_user()函数返回jwt之前,purchase()函数似乎会继续。日志输出显示,在jwt从get_jwt_token_for_user()函数打印到控制台之前,数

我试图开始使用谷歌钱包,并通过ajax请求生成jwt令牌

当用户点击purchase按钮时,它启动purchase()函数,该函数使用get_jwt_token_for_user()函数发送一些数据以获取jwt。我已经将ajax请求设置为非异步,以确保jwt被发送到google支付处理程序

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

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请求已经返回了数据吗?

你的
get\u jwt\u token\u for\u user
函数不返回任何内容,你需要这样的东西:

function get_jwt_token_for_user(the_key) {
    //...
    var myObject;
    $.ajax({ 
        //...
        success: function(result) {
            myObject = JSON.parse(result);
        },
        //...
     });
     return myObject ? myObject.jwt_token : '';
}
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 !== "") {
            //...
        }
    });
}
success
回调返回某个值不会导致
$返回该值。ajax
和JavaScript函数不会返回其最后表达式的值,如果希望函数返回某个值,则必须包含显式的
返回值

您还应该尽快停止使用
async:false
,因为这对用户来说是非常有害的。您的代码应该更像这样:

function get_jwt_token_for_user(the_key) {
    //...
    var myObject;
    $.ajax({ 
        //...
        success: function(result) {
            myObject = JSON.parse(result);
        },
        //...
     });
     return myObject ? myObject.jwt_token : '';
}
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 !== "") {
            //...
        }
    });
}

不确定这是否会解决异步问题,但您的return语句在成功处理程序中没有任何用处。我认为您需要在$.ajax()调用完成后使用它,所以请将它放在后面。否则,get_jwt_token_for_user()函数将始终返回null。请重新构造代码,以便要执行的代码进入回调;)有点困惑-您发布的代码中没有任何东西实际从我所看到的调用
purchase
函数,即没有调用它。使用
function(){$.ajax({…})}
,,用匿名函数包装ajax?@Sheikheera:No
return
语句意味着没有返回值,你能看一下接受的答案吗?真棒的家伙-完美地解决了这个问题。关于async=false提示,我也会听取你的建议。@Sheikheera:(1)这个答案很古老,jQuery接口已经改变了。(2) 该问答中
success
处理程序的返回值将被忽略。(3) 匿名单击处理程序函数不返回任何内容。