在 Ionic 2/Angular 2 中解决了一些 Promise 后如何 return Observable?

How to return Observable after some Promise get resolved in Ionic 2/Angular 2?

我试图在成功完成我的 Promise 后 return 一个 Observable,但该函数不是 returning Observable。 具体到代码,我想从存储中获取授权令牌(returns promise),然后在获取数据之后生成一个 Post 请求到 Api(return可观察)。通过这样做,sublime text 在 "a function whose declared type is neither 'void' nor 'any' must return a value" 函数上给出了一个错误 下面是我的代码,

logout() : Observable<any>{
  this.userData.getAuthToken().then((token)=>{
    this.token = token;
    this.headers = new Headers ({
      "X-USER-TOKEN": token
    });
    this.options = new RequestOptions ({
      headers: this.headers
    });
    var logout_url = "Api logout method";
    return this.http.post(logout_url,{},this.options)
      .map (res => res.json())
  });
}

如果我只是做一个 post 请求那么它 return 就可以了

return this.http.post(logout_url,{},this.options)
  .map (res => res.json())

但是当我尝试获取数据时,它不会从这个 post 请求中获取 return 值。 任何帮助都感激不尽!提前致谢

你会 return 一个 Promise (如果你没有错过它前面的 return 部分)这会 return 一个 Observable 成功。考虑仅使用 Observables,而不是将两者混合使用。

也可以封装成新的Observablenew Observable(observer =>
https://angular-2-training-book.rangle.io/handout/observables/using_observables.html

使用 fromPromise to convert the promise into an observable and use mergeMap 将 HTTP 响应发送到组合的可观察对象中:

import { Observable } from 'rxjs/Observable/';
import 'rxjs/add/observable/fromPromise';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/mergeMap';

logout(): Observable<any>{
  return Observable.fromPromise(this.userData.getAuthToken()).mergeMap(token => {
    this.token = token;
    this.headers = new Headers({
      "X-USER-TOKEN": token
    });
    this.options = new RequestOptions({
      headers: this.headers
    });
    var logout_url = "Api logout method";
    return this.http.post(logout_url, {}, this.options).map(res => res.json());
  });
}

RXJS>6,fromPromise合并为from函数,要使用mergeMap,需要先使用pipe。所以这段代码可以工作

    import { Observable, from } from "rxjs";
    import { map, mergeMap } from "rxjs/operators";
    
    logout(): Observable<any>{
      return from(this.userData.getAuthToken()).pipe(mergeMap(token => {
        this.token = token;
        this.headers = new Headers({
          "X-USER-TOKEN": token
        });
        this.options = new RequestOptions({
          headers: this.headers
        });
        var logout_url = "Api logout method";
        return this.http.post(logout_url, {}, this.options).map(res => res.json());
      }));
    }

来自 Sunil 的回答适用于我的用例,这是我的工作示例。我在我的 http 拦截器中使用它来将访问令牌附加到 HTTP 请求

import {from, Observable} from "rxjs";
import {mergeMap} from "rxjs/operators";

 handleTokenExpiration(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (this.isAccessTokenPresent()) {
      request = request.clone({
        setHeaders: {
          Authorization: `Bearer ${this.getAccessToken()}`
        }
      });
      return next.handle(request);
    } else {
      if (this.isRefreshTokenPresent()) {
        return from(this.refreshToken(this.getRefreshToken())).pipe(mergeMap(res => {
          request = request.clone({
            setHeaders: {
              Authorization: `Bearer ${this.getAccessToken()}`
            }
          });
          return next.handle(request);
        }));
      } else {
        this.logout();
      }
    }
  }