如何实现多个类以对后端系统进行多次调用?

时间:2018-10-10 14:55:43

标签: angular typescript design-patterns

我实现了必须对不同的api进行两次调用并组合响应的模式,   如果有更好的方法或最佳实践来完成这些任务,我需要专家的帮助。

在getBalanceController调用两个API来使用axios检索响应的情况下,在以下情况下可以遵循的良好设计是什么?只是想确保我没有做任何多余的事情。

getBalanceController.ts

import {Controller,Body} from 'tsoa';
import {AdminHandler} from "./AdminHandler";
import {ClientHandler} from "./ClientHandler";

export class GetBalanceController extends Controller {
    public static async process(@Request() request: ExpressRequest,
        response: ExpressResponse): Promise < any > {
        try {
            const instance = new GetBalanceController();
            const data = await instance.execute(request, response);
            response.status(200);
            response.send(data);
        } catch (err) {
            response.status(200);
            response.send(err.message);
        }

    }

    private _request: IRequestURL[] = [];
    constructor() {
        super();
    }

    private async execute(@Request() request: ExpressRequest, response: ExpressResponse): Promise < any > {
        buildResponses:any = [];
        try {
            const _adminData = await AdminHandler.process(request,response);
            const _clientData = await ClientHandler.process(request,response);
            buildResponses.Details.push(_adminData, _caremarkData);
        } catch (err) {
            return Promise.reject(err);
        }
        return buildResponses;
    }

}

adminHandler.ts

import {Controller,Body} from 'tsoa';

export class AdminHandler extends Controller {
    public static async process(@Request() request: any,
                                            response: any): Promise<any> {
        try {
            const instance = new AdminHandler();
            const data = await instance.execute(request);
            response.status(200);
            response.send(data);
        } catch (err) {
            response.status(200);
            response.send(err.message);
        }

    }

    constructor() {
        super();
    }
    public async execute(@Body() _request: any): Promise<any> {
        let result: any;
        try {
            const url = "adminUrl;
            const requestKeys: string[] = Object.keys(_request);
            if (requestKeys.length !== 1 ||
                !(_request[requestKeys[0]].details && _request[requestKeys[0]].details.tokenId)) {
                throw new Error("Invalid request");
            }
            const response: any = await axios.post(url, _request);
            result = response.data;
        } catch (err) {
            return Promise.reject(err);
        }
        return Promise.resolve(result);
    }
    // there will be another method that will be called again from main controller to customize the response.
}

clientHandler.ts

import {Controller,Body} from 'tsoa';

export class ClientHandler extends Controller {
    public static async process(@Request() request: any,
                                            response: any): Promise<any> {
        try {
            const instance = new ClientHandler();
            const data = await instance.execute(request);
            response.status(200);
            response.send(data);
        } catch (err) {
            response.status(200);
            response.send(err.message);
        }

    }

    constructor() {
        super();
    }
    public async execute(@Body() _request: any): Promise<any> {
        let result: any;
        try {
            const url = "clientUrl;
            const requestKeys: string[] = Object.keys(_request);
            if (requestKeys.length !== 1 ||
                !(_request[requestKeys[0]].details && _request[requestKeys[0]].details.tokenId)) {
                throw new Error("Invalid request");
            }
            const response: any = await axios.post(url, _request);
            result = response.data;
        } catch (err) {
            return Promise.reject(err);
        }
        return Promise.resolve(result);
    }

    // there will be another method that will be called again from main controller to customize the response.
}

0 个答案:

没有答案