场景:
我有很多服务,其中有大量重复的数据调用代码,我想通过调用包装函数来减少创建这些代码所需的代码量:
基本上,所有这些功能都执行相同的操作。
这是我概括包装函数(用于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...)
这样,一个函数将处理所有后得到和删除的诺言。
答案 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);
}