Observable.map setTimeout 函数 return 输入 angular 5
Observable.map setTimeout function with return type in angular 5
我想在 Observable.map 函数中稍等片刻,然后 return 输入一个值
我的密码是:
public loginRequest(userCredentials: any): Observable<TSUser | undefined> {
return this.http.post<TSUser>(this.serviceURL + '/login', userCredentials).map((response: any) => {
window.setTimeout(() => {
this.initWithCookie();
return this.principal;
}, 300);
//error TS2322: Type 'Observable<void>' is not assignable to type 'Observable<TSUser | undefined>'. Type 'void' is not assignable to type 'TSUser | undefined'.
});
};
如何 return 使用 setTimeout 函数获得正确的 Observable 类型。使用我的代码我得到了错误
error TS2322: Type 'Observable<void>' is not assignable to type 'Observable<TSUser | undefined>'. Type 'void' is not assignable to type 'TSUser | undefined'.
如果我这样做:
public loginRequest(userCredentials: any): Observable<TSUser | undefined> {
return this.http.post<TSUser>(this.serviceURL + '/login', userCredentials).map((response: any) => {
return Observable.timer(300).map(() => {
this.initWithCookie();
return this.principal;
}).take(1);
});
};
我收到错误
error TS2322: Type 'Observable<Observable<TSUser | undefined>>' is not assignable to type 'Observable<TSUser | undefined>'.
解决方案
根据马丁的回答,我的工作代码是
public loginRequest(...): Observable<TSUser | undefined> {
return this.http.post<TSUser>(...).delay(300).concatMap(response => Observable.of(this.initWithCookie()));
};
(我想等待 300 毫秒 在 我执行函数中的代码之前)
不使用 setTimeout
并让 RxJS 使用 delay()
运算符为您延迟会更容易:
return this.http.post<TSUser>(...)
.concatMap(response => Observable.of(response).delay(300));
您可以使用 setTimeout
,但您必须使用 Observable.create(observer => {})
并将 setTimeout
内的结果发送到 observer.next(...)
,这不必要地复杂。
在 RxJS v6 中,运算符的导入和使用语法已更改。
import { of } from 'rxjs';
import { delay, concatMap } from 'rxjs/operators';
return of({delay_time: 3000}).pipe(
concatMap(response => of('Delayed by: ' + response.delay_time + ' ms').pipe(delay(response.delay_time)))
);
我想在 Observable.map 函数中稍等片刻,然后 return 输入一个值
我的密码是:
public loginRequest(userCredentials: any): Observable<TSUser | undefined> {
return this.http.post<TSUser>(this.serviceURL + '/login', userCredentials).map((response: any) => {
window.setTimeout(() => {
this.initWithCookie();
return this.principal;
}, 300);
//error TS2322: Type 'Observable<void>' is not assignable to type 'Observable<TSUser | undefined>'. Type 'void' is not assignable to type 'TSUser | undefined'.
});
};
如何 return 使用 setTimeout 函数获得正确的 Observable 类型。使用我的代码我得到了错误
error TS2322: Type 'Observable<void>' is not assignable to type 'Observable<TSUser | undefined>'. Type 'void' is not assignable to type 'TSUser | undefined'.
如果我这样做:
public loginRequest(userCredentials: any): Observable<TSUser | undefined> {
return this.http.post<TSUser>(this.serviceURL + '/login', userCredentials).map((response: any) => {
return Observable.timer(300).map(() => {
this.initWithCookie();
return this.principal;
}).take(1);
});
};
我收到错误
error TS2322: Type 'Observable<Observable<TSUser | undefined>>' is not assignable to type 'Observable<TSUser | undefined>'.
解决方案 根据马丁的回答,我的工作代码是
public loginRequest(...): Observable<TSUser | undefined> {
return this.http.post<TSUser>(...).delay(300).concatMap(response => Observable.of(this.initWithCookie()));
};
(我想等待 300 毫秒 在 我执行函数中的代码之前)
不使用 setTimeout
并让 RxJS 使用 delay()
运算符为您延迟会更容易:
return this.http.post<TSUser>(...)
.concatMap(response => Observable.of(response).delay(300));
您可以使用 setTimeout
,但您必须使用 Observable.create(observer => {})
并将 setTimeout
内的结果发送到 observer.next(...)
,这不必要地复杂。
在 RxJS v6 中,运算符的导入和使用语法已更改。
import { of } from 'rxjs';
import { delay, concatMap } from 'rxjs/operators';
return of({delay_time: 3000}).pipe(
concatMap(response => of('Delayed by: ' + response.delay_time + ' ms').pipe(delay(response.delay_time)))
);