2017-08-17 62 views
2

我想在ionic3未定義響應在ionic3

submitLoginForm() { 
    var username = this.formData.value.username; 
    var password = this.formData.value.password; 
    var bodyjson; 
    var userId; 

    this.ApidataService.logincheck(username,password).subscribe(data => { 
     this.logindetail = data; 
     bodyjson = JSON.parse(this.logindetail._body); 
     userId = bodyjson.user.id; 
     if(userId != undefined){ 
      this.ApidataService.userdata(userId).subscribe(data => { 
       this.userInfo = data; 
      }); 
     } 
     console.log(userId); 
    }); 
    console.log(this.userInfo); 
} 

實現嵌套調用API現在,當我調用該函數未定義第一個呼叫,然後從第二個呼叫起嵌套API返回它會返回適當的值,但是當我嘗試記錄正在發送給api的參數時,我注意到每次都傳遞了正確的值。我相信這是由於一些同步問題,但無法找出問題和解決方案。

+0

,而不是'(!用戶id =未定義)'只是檢查像'(用戶ID)' –

+1

你可以找到的角版本重複在這裏:https://stackoverflow.com/questions/43055706/how-do-i-return-the-response-from-an-observable-http-async-call-in-angular2。你正在做的是試圖同步訪問異步操作的響應。 Javascript不能像那樣工作。該鏈接涵蓋了js的異步行爲的fundemantals。如果你想連鎖你的observable,你可以檢查:https://stackoverflow.com/questions/36712659/angular-2-two-backend-service-calls-on-success-of-first-service/36712707#36712707 – echonax

回答

0

您可以在這裏使用flatMap。看起來您不需要檢索兩個請求的結果,因此這應該適合您。

import { Observable } from "rxjs/Observable"; 
import 'rxjs/add/observable/flatMap'; 

然後:

this.ApidataService.logincheck(username,password).flatMap(
    (data) => { 
     this.logindetail = data; 
     bodyjson = JSON.parse(this.logindetail._body); 
     userId = bodyjson.user.id; 
     if(userId != undefined){ 
      return this.ApidataService.userdata(userId); 
     }else{ 
      return Observable.empty(); 
     } 
    }).map((res: Response) => res ? res.json() : {}) 
    .subscribe(data => { 
      this.userInfo = data ? data : {}; 
    }); 

你可以閱讀更多關於flatMap here

+1

**總是**在我看來,使用'forkJoin'是一個強有力的主張。還有其他幾種方法來處理這種情況。例如'flatMap/mergeMap' – echonax

+1

已更正。感謝信息@echonax – Sampath

+0

沒問題。但是再次你的回答是錯誤的,因爲'forkJoin'並行地提出請求。在OP的情況下,異步調用請求取決於其他人的響應。所以.. – echonax