首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在每次服务调用前运行方法?(Angular 7)

如何在每次服务调用前运行方法?(Angular 7)
EN

Stack Overflow用户
提问于 2019-04-09 21:09:28
回答 3查看 667关注 0票数 1

在执行服务方法之前,我正在尝试从本地存储获取“有效负载”。实际上,我正尝试在构造函数方法上这样做,但有时当一个方法调用时,变量"this.payload“不会被设置。

这是我的代码

代码语言:javascript
复制
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
        });
    }
}

正确的做法是什么?我知道在控制器中,我不应该在构造函数方法上写任何东西,但是在服务中它是正确的吗?

EN

回答 3

Stack Overflow用户

发布于 2019-04-09 21:19:15

如果您想在每次list()调用之前获取有效负载,您可以这样做:

首先创建一个方法返回一个从本地存储获取值的observable,然后使用switchMap返回一个内部observable (这是HTTP get请求)

代码语言:javascript
复制
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

执行/点击:https://www.learnrxjs.io/operators/utility/do.html

票数 2
EN

Stack Overflow用户

发布于 2019-04-09 21:31:55

创建一个getPayload函数tp获取本地存储数据,并在列表函数中使用switchMap将getPayaload数据传递给api。

代码语言:javascript
复制
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
                })
            },
        )
    );
}
票数 1
EN

Stack Overflow用户

发布于 2019-04-09 21:12:14

使用forkJoin操作符

https://www.learnrxjs.io/operators/combination/forkjoin.html

代码语言:javascript
复制
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;
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55593717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档