2016-10-20 239 views
1

我有非常簡單的代碼,但我無法理解它。對Angular2的承諾承諾

我有它返回當前用戶名服務

所以我做下面進入登錄網頁的用戶名和顯示。請注意當前登錄的用戶是「演示」

this.userData.getUsername().then(value => { 
this.username = value ; 
console.log("Inside -->" + value); 
}); 
console.log("Outside -- >" + this.username); 

所以現在當我運行此代碼。我不this.username

得到的用戶名這是執行console.log輸出
Outside -- >undefined Inside -->demo
Shoulnd't兩種情況下,這顯示「演示」。 (內外) 爲什麼外界未定義?

請幫我理解這一點。

+1

這是因爲這個調用是異步的。它開始運行'getUsername()'方法,但在運行時繼續運行。所以它首先打到外部日誌,其中'this.username'仍然是未定義的,那麼方法結束,你會得到Inside log –

+0

它與Angular 2沒有任何關係。這就是異步調用的工作原理, ://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests) –

回答

2

這是預期的行爲。

這是一個異步調用,後來

this.userData.getUsername().then(value => { 
    this.username = value ; 
    console.log("Inside -->" + value); 
}); 

返回在此期間繼續執行此

console.log("Outside -- >" + this.username); 

當異步調用完成最終Promise執行功能

value => { 
    this.username = value ; 
    console.log("Inside -->" + value); 
} 

這是早先通過的。

+0

謝謝。那麼我如何在全局變量(this.username)中獲取用戶名? – viks

+1

這就是你的代碼已經在做什麼。你似乎困惑的是什麼時候會發生什麼。 'this.username = value;'稍後執行'console.log(「Outside - >」+ this.username);' –

+1

明白了。我只是感到困惑,並沒有編碼下一步。我實際上在變量中獲得了正確的值。應該只是相信自己。 – viks