无法从回调函数设置全局变量

时间:2012-11-14 10:09:10

标签: javascript jquery javascript-events

我无法从CallBack函数ApiToken设置全局变量processGetToken。 你能解释一下原因吗,并发布代码样本吗?

$(document).ready(function () {

    // General Settings
    var ApiToken, ApiUriGetToken, ApiUriGetPlaylist,
    ApiSettings = {
        clientId: encodeURIComponent('aaa'),
        clientSecret: encodeURIComponent('bbb')
    };
    //-------------------------------------------------------------------------------------
    // URIs to xxx API:
    // Token
    ApiUriGetToken = 'https://api.xxx.com/oauth/token?grant_type=client_credentials&client_id=' + ApiSettings.clientId + '&client_secret=' + ApiSettings.clientSecret;

    //--------------------------------------------------------------------------------------
    // Asynchronous requests using Ajax

    // Get Token
    function ApiGetToken() {
        $.getJSON(ApiUriGetToken, processGetToken);
    }

    // Get Token : Callback
    function processGetToken(data) {
        ApiToken = data.access_token;   // Set the Token as Global variable
        // Update the URIs with the a Token generated
        ApiUriGetPlaylist = 'https://api.xxx.com/playlist?oauth_token=' + ApiToken + '&account=' + ApiSettings.clientId;
    }

    //--------------------------------------------------------------------------------------
    // Get Categories
    function ApiGetPlaylist() {
        ApiGetToken();  // Get a fresh Token
        $.getJSON(ApiUriGetPlaylist, processGetCategories);
    }

    // Get Categories : Callback
    function processGetCategories(data) {
        var content = '';
        // Trasvers
        $.each(data.result, function (i, element) {
            content += element.name;
        });
        // Inject in the DOM
        $('#view01-caregories').text('ciao');

    }
    //--------------------------------------------------------------------------------------

    // Testing
    ApiGetToken();
    console.log('ApiUriGetToken: ' + ApiUriGetToken);
    console.log('ApiToken: ' + ApiToken);

});

2 个答案:

答案 0 :(得分:0)

在函数内部声明变量ApiToken,因此它只存在于该函数中 - 而不是它。为了使它成为全局的,只需在函数之外声明它......

var ApiToken;

$(document).ready(function () {

    // General Settings
    var ApiUriGetToken, ApiUriGetPlaylist,
    ApiSettings = {
        clientId: encodeURIComponent('aaa'),
        clientSecret: encodeURIComponent('bbb')
    };

你仍然在函数内部使用它完全相同,但它全局存在,所以其他所有东西都可以引用它。

答案 1 :(得分:0)

问题在于连接AJAX异步请求。我将代码放在一个独特的回调函数中,解决了这个问题。