闭包中的变量

时间:2012-11-09 11:50:42

标签: javascript jquery

我在可变结果中使用函数表达式的属性中有一个JS对象。

我需要填充结果变量并在调用processData时返回它。

你能否告诉我这里我做错了什么,如果你简要解释一下这个问题并添加一个好的馅饼就会很棒。

$(document).ready(function () {

    // General Settings
    var 
    ApiSettings = {
        clientId: 'aaa',
        clientSecret: 'bbb'
    }

    ApiSettings.uriGetToken = 'https://ccc.com/oauth/token?grant_type=client_credentials&client_id=' + encodeURIComponent(ApiSettings.clientId) + '&client_secret=' + encodeURIComponent(ApiSettings.clientSecret);

    ApiSettings.token = (function () {
        var result; // I'm not able to set this variable
        // Make an Ajax Request
        $.getJSON(ApiSettings.uriGetToken, processData);
        function processData(data) {
            result = data.access_token;
        }
        return result;
    })();

    console.log(ApiSettings);
    console.log(ApiSettings.uriGetToken);
    console.log('FINAL:' + ApiSettings.token);
});

1 个答案:

答案 0 :(得分:3)

您实际上可以使用代码设置结果变量。问题是您使用.getJSON()这是一种异步方法。您将触发Ajax请求,然后您的JavaScript将直接返回return方法并返回结果,然后服务器才有机会响应。因此,在您有时间更新结果之前,您将从函数返回。

异步方法最初可能有点难以掌握,特别是如果您是初学者。您需要做的是重构代码,以便不使用与读取值相同的方法获取值。

另一种选择是使用同步Ajax请求,强制JavaScript在返回结果之前等待服务器响应。这很少是一个好主意,因为在服务器返回之前,您的UI将无法响应。