2017-08-15 55 views
0

我嘗試鏈接兩個http請求(到ASP.NET核心MVC Web Api)。訂單很重要,所以我試圖使用.flatMap()RxJs鏈兩個http調用 - ASP.NET Core MVC Web Api

  1. 我想創建一個用戶
  2. 我想打電話給獲得用戶的方法(這是一個單獨的microService)

    constructor(private dataService: DataService) { } 
    
    getUser(): Observable<User | null> { 
        if (!this.retrieve("IsAuthorized") || (this.retrieve("Email") === "" || this.retrieve("Email") === null)) { 
         return Observable.of(null); 
        } 
    
        return this.getUserByEmail(this.retrieve("Email")) 
         .do((user: User) => { 
          this.setCurrentUser(user); 
         }); 
    } 
    
    public createUser(email: string, familyName: string, givenName: string, phoneNumber: string, gender: string): Observable<User | null> { 
        let createUser = this.dataService.post(this.usersApiUrl, null, { 
         Email: email, FamilyName: familyName, 
         GivenName: givenName, PhoneNumber: phoneNumber, Gender: gender 
        }).map(response => response.json()); 
    
        return createUser.flatMap((res: Response) => { return this.getUser(); }) 
    } 
    
    private setCurrentUser(user: User) { 
        this.currentUser.next(user); 
    } 
    
    private getUserByEmail(email: string): Observable<User> { 
        return this.dataService.get(this.usersApiUrl, email).map(response => response.json()); 
    } 
    

this.currentUserReplaySubject<User> = new ReplaySubject<User>(1);

電流行爲:POST(創建用戶)按預期工作。 GET(this.getUser())不會被調用。

P.S:我沒有真正有興趣創建用戶響應,因爲那隻會告訴我它成功了。

更新:

private retrieve(key: string): any { 
     var item = this.storage.getItem(key); 

     if (item && item !== 'undefined') { 
      return JSON.parse(this.storage.getItem(key)); 
     } 

     return null; 
    } 

哪裏this.storagelocalStorage

而且我訂閱了這個以經典的方式:

this.userService.createUser(this.authService.email, this.authService.familyName, 
    this.authService.givenName, this.authService.phoneNumber, this.authService.gender).subscribe(() => { }); 
+0

但什麼是不工作?也許你會想要發佈所有的代碼(包括'this.retreive()','this.currentUser'和你使用'.flatMap()'的地方,這樣更容易調試 – CozyAzure

+0

@CozyAzure我更新了我的問題與訂閱呼叫和檢索功能。正如我所說,目前它只是激發創建用戶HTTP呼叫,但它永遠不會得到用戶後 –

回答

0

從Rx &客戶端角度來看,初次嘗試是正確的。

的問題與ASP.NET MVC的核心網絡API,其中:

[HttpPost] 
public void Post([FromBody]CreateUserRequest request) 
{ 
    _service.Create(request); 
} 

返回一個200空的內容,而不是204(無內容)和引起流(RX)失敗。

https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api

您可以更改到:

[HttpPost] 
public IActionResult Post([FromBody]CreateUserRequest request) 
{ 
    _userService.Create(request); 
    return NoContent(); 
} 
0

如果你要做的就是調用createUser方法,我覺得比getUser不點火,因爲沒有什麼是訂閱它。將.subscribe()添加到getUser調用,看看是否有幫助。

+0

這將意味着修改我的返回類型,我沒有真的在看這個。我想繼續返回一個Observable 並且在那個函數裏面我想要一個http調用鏈--create + get並且能夠訂閱這個 –

+0

如果你想保持返回類型,不要直接返回,使用臨時變量,如'let obs = this.getUserByEmail ...',然後是'obs.subscribe()'和'return obs;' –

+0

我試過這種方法,它具有相同的行爲。 –