在 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
,而不是将两者混合使用。
也可以封装成新的Observable
:new 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();
}
}
}
我试图在成功完成我的 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
,而不是将两者混合使用。
也可以封装成新的Observable
:new 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();
}
}
}