【问题标题】:how to create function that return Observable after verifications?如何创建验证后返回 Observable 的函数?
【发布时间】:2018-02-11 07:54:26
【问题描述】:

我想在检查令牌是否有效然后获取正确的 url 后返回一个 http.get observable,最后返回一个 get observable。我写了这段代码,但没有编译,error : A function whose declared type is neither 'void' nor 'any' must return a value.

getListObs<T>(target):Observable<T>{
this.tokenifyObs().subscribe(
  token => {
    console.log("get list of objects ")
    return Observable.create(observer => {
      let myUrl = this.urls_list[this.baseUrl] + this.urls_list[target];
      observer.next(myUrl);
    })
    .subscribe( (myUrl)=>{
      return this.http.get<T[]>(myUrl)
    })
  })

}

tokenifyOsb 方法代码:

    tokenifyObs():Observable<String>{
    return Observable.create(observer => {
      console.log("checking token.. ")
      if(! this.token){
        let token = sessionStorage.getItem("token")
        this.token = token
        this.header.headers["authorization"] = this.auth + token;
        this.validAuth = true
      }
      console.log("token is : ", this.token)
      observer.next(this.token);
    })
  }

【问题讨论】:

    标签: angular typescript rxjs observable


    【解决方案1】:

    您收到的错误意味着您为方法getListObs&lt;T&gt;(target):Observable&lt;T&gt; 指定了返回类型,但您没有返回任何内容。只需编写 return this.tokenifyObs().subscribe(... 即可消除打字稿错误。然而,这将返回一个订阅,而不是一个 Observable。你不需要订阅这个方法,只需返回 observable 即可。我还没有看到你的整个代码,但我认为这是你可以开始的地方:

    getListObs<T>(target):Observable<T>{
      return this.tokenifyObs()
        .switchMap(token => { // you are not using token anywhere so you can replace it with ()
            let myUrl = this.urls_list[this.baseUrl] + this.urls_list[target];
            return this.http.get<T>(myUrl);
        });
      }
    

    【讨论】:

    • 我按照你的说法转换了代码,现在出现另一个错误:'Observable' 类型上不存在属性'switchMap'。即使我把它作为模板留下,错误是在谈论字符串?我不明白这是什么意思
    • 这里是我的包含 import { Observable } from 'rxjs/Observable';从 'rxjs/observable/of' 导入 { of }; import { catchError, map, tap, switchMap } from 'rxjs/operators';
    • 你能贴出this.tokenifyObs()方法的代码吗?
    • 另外,尝试像这样导入:import {Observable} from 'rxjs/Rx'; 它的操作符比'rxjs/Observable' 多,应该可以消除错误。
    • 是的,从 Rx 导入 Observable 改变了错误,现在错误从 switchMap 转移到返回并说:类型 'Observable' 不能分配给类型 'Observable'。类型“T[]”不可分配给类型“T”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 2020-12-04
    相关资源
    最近更新 更多