2012-11-09 78 views
0

我有一個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); 
}); 
+0

quentin,謝謝,但我相信它不是重複的,因爲我有一個變量的問題,而不是與AJAX響應。讓他們知道你的動作 – GibboK

+1

這是一個重複的。如果有點難以爲你解析,那是說你不能真正做你想做的事情;這就是Javascript的工作原理。您需要將回調傳遞給您的匿名函數 - 另一個內部函數,當您在processData中接收到結果時將被調用。這就是你應該繼續做更多工作的地方,而不是當你從調用$ .getJSON – jrajav

+0

的函數返回時,事情就是ajax是異步的,所以即使你在創建時調用該函數,結果也不會被填充到after ajax調用將返回。 –

回答

3

你實際上能夠用你的代碼設置結果變量。問題是您使用的是異步方法.getJSON()。您將釋放Ajax請求,然後您的JavaScript將直接返回返回方法並返回結果,然後服務器有機會響應。因此,在您有時間更新結果之前,您正從函數返回。

異步方法最初可能有點難以掌握,特別是如果您是初學者。你必須做的是重構你的代碼,這樣你就不用用你用來讀取值的相同方法來獲取值。

另一種選擇是使用同步Ajax請求,而不是在返回結果之前強制JavaScript等待服務器作出響應。這是,儘管很少是一個好主意,因爲您的用戶界面在服務器返回之前將無響應。

+0

我真的很感謝你的評論謝謝! – GibboK

+0

@GibboK我的榮幸! –

+1

OP問一個例子:http://jsbin.com/eviref/1/edit – jrajav