打字稿Angular2错误时,一个承诺,创造一个可观察
我试图在getToken()
检索来自离子含量storage
令牌,并且不是用它在refreshToken()
看到如果令牌被传递到(this.jwtHelper.isTokenExpired(this.token)
它返回一个真正的过期或取决于令牌是否过期。我已经把意见在refreshToken()
那里我得到了以下错误打字稿Angular2错误时,一个承诺,创造一个可观察
错误1:
Error: TS2345:Argument of type '(response: Response) => void' is not assignable to parameter of type '(value: Response) => void'. Types of parameters 'response' and 'value' are incompatible. Type 'Response' is not assignable to type 'Response'. Two different types with this name exist, but they are unrelated. Property 'body' is missing in type 'Response'.
错误2:
Error:(34, 46) TS2339:Property 'token' does not exist on type 'Promise<any>'.
我的代码
import {AuthHttp, JwtHelper, tokenNotExpired} from "angular2-jwt";
import {Observable} from "rxjs/Observable";
import {AuthService} from "../Services/Auth/auth.service";
import {Injectable} from "@angular/core";
import { Storage } from '@ionic/storage';
import {AlertController} from "ionic-angular";
@Injectable()
export class TokenProvider {
jwtHelper: JwtHelper = new JwtHelper();
token;
constructor(private authHttp: AuthHttp, private storage: Storage, private alertCtrl: AlertController) {
}
getToken(): Promise<any> {
return this.storage.get('token').then(token => {
this.token = token;
});
}
refreshToken(): Observable<any> {
return this.token = Observable.fromPromise(this.getToken())
.flatMap(() => {
if(this.jwtHelper.isTokenExpired(this.token))
{
return this.authHttp.get('localhost.api/refresh')
.subscribe( // ERROR 1 HERE
(response: Response) => {
this.token = response.json().token; // ERROR 2 HERE
},
(error: Response) => {
console.log(error);
});
}
});
}
您未在代码中导入Response
。编译器可能弄糊涂了上Response
使用,因为有可能是你的分型多重定义:
import { Response } from '@angular/http';
而且,你不必返回观察到的内部flatMap
。您正在返回Subscription
。返回像这样的原始观察值:
refreshToken(): Observable <any> {
let observable = Observable.fromPromise(this.getToken())
.filter(() => this.jwtHelper.isTokenExpired(this.token))
.flatMap(() => this.authHttp.get('localhost.api/refresh'));
observable.subscribe((response: Response) => {
this.token = response.json().token;
}, (error: Response) => {
console.log(error);
});
return observable;
}
这消除了响应错误(错误2),但现在我得到一行错误'.flatMap(()=> {'错误:(28,16)TS2345:类型'的参数)=>订阅'不能分配给类型为'(value:any,index:number)'的参数=> ObservableInput '。 类型'Subscription'不可分配给类型'ObservableInput '。 类型'Subscription'不是'ArrayLike '。 类型'Subscription'中缺少属性'length'。' – ghan
您必须返回'flatMap'内的observable。请参阅我的更新回答。 – Saravana
错误消失了,但是当我运行它时我的浏览器现在我得到这个错误'TypeError:你提供'未定义'的地方在哪里流提供一个Observable,Promise,Array或Iterable.' – ghan
该refreshToken功能是不正确
- 你不能在RxJS订阅内部运营
- 获取返回可观察到的(或承诺,因为它似乎在你的情况)
尝试以下操作:
refreshToken(): Observable<any> {
return this.token = Observable.fromPromise(this.getToken())
.flatMap(() => {
if(this.jwtHelper.isTokenExpired(this.token))
{
return this.authHttp.get('localhost.api/refresh')
}
})
.catch(() => console.log(error))
.map(response: Response => response.json())
.subscribe(value => {
this.token = value.token
})
}
您可以添加该文件的导入语句吗? – Saravana
用进口更新 – ghan