在执行服务方法之前,我正在尝试从本地存储获取“有效负载”。实际上,我正尝试在构造函数方法上这样做,但有时当一个方法调用时,变量"this.payload“不会被设置。
这是我的代码
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import * as Globals from '../../globals';
import { Observable, of } from 'rxjs';
import { LocalStorage } from '@ngx-pwa/local-storage';
@Injectable({
providedIn: 'root'
})
export class RechargesService {
public payload;
constructor(
private http: HttpClient,
public localStorage: LocalStorage
) {
this.localStorage.getItem("payload").subscribe((payload) => {
this.payload = payload;
})
}
list(): Observable<any> {
return this.http.post(Globals.url_api + "recharges/list", {
// Sometimes this.payload isn't setted, i don't know why
"payload": this.payload
});
}
}正确的做法是什么?我知道在控制器中,我不应该在构造函数方法上写任何东西,但是在服务中它是正确的吗?
发布于 2019-04-09 21:19:15
如果您想在每次list()调用之前获取有效负载,您可以这样做:
首先创建一个方法返回一个从本地存储获取值的observable,然后使用switchMap返回一个内部observable (这是HTTP get请求)
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import * as Globals from '../../globals';
import { Observable, of} from 'rxjs';
import { tap, switchMap } from 'rxjs/operators';
import { LocalStorage } from '@ngx-pwa/local-storage';
@Injectable({
providedIn: 'root'
})
export class RechargesService {
public payload;
constructor(
private http: HttpClient,
public localStorage: LocalStorage
) {
}
getPayload = () => {
return this.localStorage.getItem("payload").pipe(tap(payload => this.payload = payload)); // <--- the tap() may be redundant here. you can simply get payload in list() method
}
list(): Observable<any> {
return this.getPayload().pipe(
switchMap(payload => {
return this.http.post(Globals.url_api + "recharges/list", {"payload": this.payload}) // <--- You can use payload instead of this.payload since localStorage already returns payload
})
);
}
}switchMap:https://www.learnrxjs.io/operators/transformation/switchmap.html
发布于 2019-04-09 21:31:55
创建一个getPayload函数tp获取本地存储数据,并在列表函数中使用switchMap将getPayaload数据传递给api。
getPayload(){
return this.localStorage.getItem("payload");
}
list(payload): Observable<any> {
return getPayload().pipe(
switchMap(
(payload) => {
return this.http.post(Globals.url_api + "recharges/list", {
payload
})
},
)
);
}发布于 2019-04-09 21:12:14
使用forkJoin操作符
https://www.learnrxjs.io/operators/combination/forkjoin.html
forkJoin(
this._myService.makeRequest('Request One', 2000),
this._myService.makeRequest('Request Two', 1000),
this._myService.makeRequest('Request Three', 3000)
)
.subscribe(([res1, res2, res3]) => {
this.propOne = res1;
this.propTwo = res2;
this.propThree = res3;
});https://stackoverflow.com/questions/55593717
复制相似问题