【问题标题】:Return Result of Subscription in if / else在 if / else 中返回订阅结果
【发布时间】:2020-04-03 11:39:55
【问题描述】:

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

    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;
    }));

但这毕竟不会触发请求。

Angular 8.2.14

【问题讨论】:

    标签: angular observable


    【解决方案1】:

    也许你可以尝试类似的方法(不确定这是否能正常工作,但你明白了)

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

    【讨论】:

    • 这是个糟糕的建议,因为订阅不应像承诺一样处理。
    • 所以请提出一些相关的@LingVu
    • 不要把它当作个人。
    • 刚刚标明这不是应该使用的解决方案。为什么?因为它只是糟糕的编码。已经有一个很好的解决方案应该如何使用 observables。所以只要记笔记或不记笔记。我不会继续这种无意义的讨论。
    【解决方案2】:

    一般来说,让一个函数在调用请求后返回 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
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多