RxJs链接两个http调用 - ASP.NET Core MVC Web Api

时间:2017-08-15 21:30:35

标签: angular typescript asp.net-core rxjs

我尝试将两个http请求链接到一个ASP.NET Core MVC Web Api。订单很重要,所以我尝试使用.flatMap()

  1. 我想创建一个用户
  2. 我想调用get user方法(在单独的微服务上)

    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());
    }
    
  3. 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(() => { });
    

2 个答案:

答案 0 :(得分:0)

如果您所做的只是调用createUser方法,那么我认为getUser没有被触发,因为没有订阅它。将.subscribe()添加到getUser调用,看看是否有帮助。

答案 1 :(得分:0)

Rx&amp; amp;的最初尝试是正确的。客户端的观点。

该问题与ASP.NET Core MVC Web API有关,其中:

[HttpPost] 
public void Post([FromBody]CreateUserRequest request)
{ 
  _userService.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();
 }