首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将observable传递给subscriber.next并避免嵌套

将observable传递给subscriber.next并避免嵌套
EN

Stack Overflow用户
提问于 2021-03-01 05:03:38
回答 2查看 39关注 0票数 0

我对rxjs和可观察性比较陌生。我正在尝试编写一个服务方法,该方法返回一个观察值,当订阅该观察值时,将输出HTTP请求的结果。但是,在发出请求之前,我必须确保存在正确的授权令牌(它不会总是存在)。

下面是我想出的完成这项任务的方法:

代码语言:javascript
复制
getDataFromHTTPCall (): Observable  {
    return new Observable(subscriber => {
        if (this.authorizationToken == null) {
            subscriber.error("Authorization Token Required")
        } else {
            subscriber.next(
                from(
                    axios.get(`${this.baseUrl}/getData}`, { headers: {'Authorization': this.authorizationToken }})
                ).pipe(
                    map(result => result.data),
                    catchError( (err) => {
                        console.log(err)
                        return EMPTY
                    })
                )
            )
        }
    })
}

这在技术上是可行的,但它有一些主要问题。最值得注意的是,通过将一个可观察对象传递给一个可观察对象,它需要此函数的调用者订阅两次。我一直在读到,可观察对象永远不应该像这样嵌套,我明白为什么这不是我们想要的。

我感觉有一种更好的方法来完成我想要做的事情。有人能建议一个更好的方法来使用观察物来完成这类任务吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-01 06:12:17

从发出

然后使用

调用http服务,如果

是否为空?

代码如下所示

代码语言:javascript
复制
getDataFromHTTPCall() {
    return of(this.authorizationToken).pipe(
       concatMap(authToken => {
          if (authToken == null) {
            throw new Error("Authorization Token Required")
          }
          return from(axios.get(`${this.baseUrl}/getData}`, 
                                { headers: {'Authorization': authToken }})
                 ).pipe(
                    map(result => result.data),
                    catchError( (err) => {
                        console.log(err)
                        return EMPTY
                    })
                 )
       })
    )
}
票数 1
EN

Stack Overflow用户

发布于 2021-03-01 06:41:54

该函数的逻辑听起来类似于“如果您没有存储的凭据,则抛出错误,否则通过某个管道返回axios调用put”。转换为RxJS后,可能如下所示:

代码语言:javascript
复制
getDataFromHTTPCall(): Observable {
    return this.authorizationToken == null
      ? throwError('Authorization Token Required')
      : from(
        axios.get(`${this.baseUrl}/getData}`, {
          headers: {Authorization: this.authorizationToken},
        }).pipe(/* etc */)
      );
  }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66413800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档