函数返回全局变量

时间:2016-10-26 15:44:36

标签: javascript jquery ajax global-variables

我觉得这很容易,但我无法弄清楚。

我想在getCurrentUser函数中设置currentUserId,我希望能够在其他函数中调用它。

以下是我现在拥有的内容,它返回undefined。我错过了什么?

var currentUserId;

function getCurrentUser()   {
    $.ajax({
        type: "GET",
        url: '/set_user',
        success: function(result)   {
            currentUserId = result.id;
            return currentUserId;
        },
        error: function(err)    {
            console.log(err);
        }

    })
};

getCurrentUser();
console.log("current user id is " + currentUserId);    

2 个答案:

答案 0 :(得分:2)

发生这种情况是因为在getCurrentUser方法内部,您正在进行异步AJAX调用,因此当您使用console.log进行打印时,该值尚未就绪。

GET /set_user请求成功结束时,将正确设置该值,仅在这种情况下函数:

    success: function(result)   {
        currentUserId = result.id;
        return currentUserId;
    }

将被执行,currentUserId将被设置。

根据jQuery.ajax()文档,$.ajax调用返回的值是Promise。首先,将promise返回给调用者(1),然后等待promise被解析为打印值(2)。

var currentUserId;

function getCurrentUser()   {
    return $.ajax({ // 1. Return the Promise here
        type: "GET",
        url: '/set_user',
        success: function(result)   {
            currentUserId = result.id;
            return currentUserId;
        },
        error: function(err)    {
            console.log(err);
        }

    })
};

// 2. Then wait the call to succeed before print the value (use the 'done' method)
getCurrentUser().done(function() {
  console.log("current user id is " + currentUserId);    
});

答案 1 :(得分:2)

就像Andrea解释的那样,当你进行ajax调用时,这个值还没准备好。

避免这种情况的一种方法是使用回调:



function getCurrentUser(callback)   {
    $.ajax({
        type: "GET",
        url: '/set_user',
        success: function(result)   {
            var currentUserId = result.id;
            if (callback)
              callback(currentUserId);
        },
        error: function(err)    {
            console.log(err);
        }

    })
};

function displayResult(userId){
  console.log("current user id is " + userId);   
}

getCurrentUser(displayResult);




这也将避免使用globe变量currentUserId。