编写通用的HttpClient包装器函数

时间:2019-02-08 09:39:22

标签: angular typescript

场景:

我有很多服务,其中有大量重复的数据调用代码,我想通过调用包装函数来减少创建这些代码所需的代码量:

基本上,所有这些功能都执行相同的操作。

  1. 他们采用返回参数
  2. 他们使用发布/获取/删除方法。
  3. 他们回报了诺言。

这是我概括包装函数(用于get)的尝试:

public httpGetPromise<T extends any>(endpoint: string, returnType: T): Promise<T> {
    const promise: Promise<returnType> = new Promise<returnType>((resolve,reject) => {
        this.http.get<returnType>(`${this.endpointBaseUri}+${endpoint})
        .toPromise().then((response) => {
             resolve(response);
        }, (err) => {
             reject(response);
        });
    });
    return promise;
}

这在某种程度上简化了它。但是我相信那里必须有更好的方法。

是否有更好的方式来编写此包装函数,以使其对不同的输入类型更为通用和可接受?

Get / Post / Delete函数的示例代码(我的调用没有包装的外观):

public saveMachine(newMachine: Machine): Promise<Machine> {
    const promise: Promise<Machine> = new Promise<Machine>((resolve, reject) => {
        this.http.post<Machine>(`${this.endpointBaseUri}/machines`, newMachine).toPromise().then((res) => {
            resolve(res);
        }, (err) => {
            reject(err);
        });
    });

    return promise;
}

public deleteMachine(machine: Machine): Promise<Machine> {
    const promise: Promise<Machine> = new Promise<Machine>((resolve, reject) => {
        this.http.delete<Machine>(this.endpointBaseUri + `/machines/${machine.id}`)
            .toPromise().then((response) => {
                resolve(response);
            }, (err) => {
                reject(err);
            });
    });

    return promise;
}

public getMachinesConfigs(machineId: string): Promise<MachineConfig[]> {
    const promise: Promise<MachineConfig[]> = new Promise<MachineConfig[]>((resolve, reject) => {
        this.http.get<MachineConfig[]>(`${this.endpointBaseUri}/machines/${machineId}/machineconfigs`
        ).toPromise().then((response) => {
            resolve(response);
        }, (err) => {
            reject(err);
        });
    });

    return promise;
}

如您所见...有很多可能性将其概括为包装函数。

这就是我的建议包装函数(用于get)的调用结果:

public getMachinesConfig(machineId:string, MachineConfig[]): MachineConfig[] {
     const endpoint: string = `/machines/${machineId}/machineconfigs`;
     return this.wrapperService.httpGetPromise(endpoint, MachineConfig[]);
}

我正在使用TypeScript 3.2.4

旁注:是否可以在包装参数中以某种方式传递我要使用的http方法类型?

赞:

public promiseFunc(httpMethod:HttpClient,..., data?:any, etc...)

这样,一个函数将处理所有后得到和删除的诺言。

1 个答案:

答案 0 :(得分:1)

确定您只能使用通用类型参数:

public httpGetPromise<T>(endpoint: string){
    const promise: Promise<T> = new Promise<T>((resolve,reject) => {
        this.http.get<T>(`${this.endpointBaseUri}${endpoint}`)
        .toPromise().then((response) => {
             resolve(response);
        }, (err) => {
             reject(reject);
        });
    });
    return promise;
}

this.httpGetPromise<MachineConfig[]>(...)

我也不认为promise构造函数在这里是必需的,您只需返回Promise重调的toPromise即可:

public httpGetPromise<T>(endpoint: string){
    return this.http.get<T>(`${this.endpointBaseUri}${endpoint}`)
        .toPromise();
}

您的示例用法如下:

public getMachinesConfig(machineId:string): MachineConfig[] {
     const endpoint: string = `/machines/${machineId}/machineconfigs`;
     return this.wrapperService.httpGetPromise<MachineConfig[]>(endpoint);
}