2016-07-28 28 views
2

我有一個簡單的方法,使一個POST請求Angular2第一響應於POST請求未定義

postData(){ 
    var headers = new Headers(); 
    headers.append('Content-Type', 'application/json'); 
    var json = JSON.stringify({email: 'Admin', password: 'Admin'}); 

    return this._http.post('http://localhost:8080/addressbook_rest/api/v1/contacts/login', json , 
    {headers: headers}); 

} 

然後從另一個分量I調用上述方法

onLogin() { 
    this._service.postData().map(res => res.json()).subscribe(
    data => { this.loggedin = data }, 
    err => { console.log(err); } 
); 

    console.log(this.loggedin); 
} 

的問題是,在第一調用,這個變量this.loggedin是未定義的,但之後,我得到了我想要的(this.loggedin = true)。我不知道爲什麼它只能從第二次獲得它。

回答

2

事實上,這是因爲請求是異步處理的。這意味着console.log(this.loggedIn);將首次返回undefined,因爲它不在訂閱回調中。它在接收請求響應之前執行。

你應該使用類似的東西:

onLogin() { 
    this._service.postData().map(res => res.json()).subscribe(
    data => { 
     this.loggedin = data; 
     console.log(this.loggedin); // <------- 
    }, 
    err => { console.log(err); } 
); 
} 
+0

但我需要在一個IF中POST後的this.loggedin。我應該怎麼做才能讓這個郵件的價值在那裏?如果(!this.loggedin){this.errorMsg ='登錄失敗';} – mlhack

+0

要解決您的第一個問題,您可以將'loggedIn'屬性初始化爲'false'。否則,你需要異步思考你的應用程序。我不知道你的代碼,但我會看到這樣的:'this._service.login(this.user).subscribe(loggedIn => {if(!loggedIn){this.errorMsg ='無法登錄' ;}});'看看我的意思? –

1

這是因爲POST請求是異步的。你應該檢查你的this.loggedin裏面的訂閱功能或內部地圖功能。在console上打印時,this.loggedin中沒有任何內容存儲,它將在成功調用ajax後進行更新。

看到這個服務here希望它能幫助你解決你的問題。 dragon.service.ts


要POST之後檢查它使用.then()它是成功的承諾的回調。它會在你的ajax調用返回時運行。你應該在那裏使用console.log()。

+0

你可以從Github下載我的項目。它正在處理POST和GET請求。 https://github.com/khanstudio-github/Angular2AppASPNet 你能分享你的最終代碼或錯誤嗎?因爲這將很容易調試你的錯誤 –