在if / else中返回订阅结果

时间:2019-12-10 10:02:49

标签: angular observable

我有一个函数,该函数应根据发出http发布请求的函数的返回值返回布尔值:

    checkPost(callRequest: boolean): boolean {
        console.log('START REQUEST');
        if(callRequest){
            this.makeRequest().subscribe(result => {
                console.log(`RESULT ${result}`);
                return result;
            }
            console.log('THIS SHOULD NEVER SHOW');
        }else{
            ...
        }
        console.log('THIS SHOULD ALSO NEVER SHOW');
    }

makeRequest非常简单:

    makeRequest(): Observable<boolean> {
        ...other stuff...
        return this.http.post<UserData>(oauth2_token_endpoint, body, {headers})
            .pipe(map(user => {
              if (user && user.access_token) {
                this._saveToken(user);
                this.currentUserSubject.next(user);
                return true;
              }
              return false;
            }));
    }

该帖子可能需要1-5秒,这很好,但是我想确保checkPost()返回makeRequest()的结果(等待它)。永远不可能超越if / else,这是正确的方法吗?

我尝试过:

    this.makeRequest().pipe(map(result => {
        console.log(`RESULT: ${result}`);
        return result;
    }));

但这毕竟不会触发请求。

角度8.2.14

2 个答案:

答案 0 :(得分:1)

通常,拥有一个在调用请求后返回true或false的函数是一个非常糟糕的主意。您可以使用一个函数,该函数返回可观察的布尔值(或任何可观察的布尔值),然后您订阅。

checkPost(callRequest: boolean): Observable<any> {
   if (callRequest)  //if callRequest, return the response of this.makeRequest
      return this.makeRequest();

   return of(null);  //else return "null" -case 1-
}

您通常会订阅checkPost

this.myservice.checkPost(true).subscribe(res=>{
  if (res==null)
        ....fall in case 1..
  if (res==true)
      ....
  if (res==false)
     ...console.res
})

答案 1 :(得分:-1)

也许您可以尝试类似的方法(不确定是否可以正常工作,但是您知道了)

ksetup /AddHostToRealmMap <host name of CAS> <realm>