Javascript:将其他类的方法绑定到功能性方法中的“ this”关键字

时间:2019-11-19 17:01:47

标签: javascript bind mixins arrow-functions

我已经为Rest API编写了一些基类。现在,我需要为处理程序使用功能性包装,而不是使用扩展此基础Rest API类的类。

但是,我不想重复所做的所有工作以使该包装方法起作用。

我已经尝试了以下方法来使其工作

// api.ts

const handler = (e: APIGatewayEvent, ctx: Context) =>
  functionalRestLambdaHandler(e, ctx, (e: APIGatewayEvent, ctx: Context) => {
    const handler = new ApiHandler(e, ctx);
    const { id } = this.getPathParameters();
    const { assigned = false } = this.getQueryStringParameters();
    try {
      return this.success(handler.handle(id, assigned));
    } catch (e) {
      return this.error(e);
    }
  });
//baseHandler.ts

export abstract class RestLambdaHandler extends BaseLambdaHandler<APIGatewayProxyEvent> {
  ...

  async success<T>(
    body?: T,
    headers?: Headers,
  ): Promise<APIGatewayProxyResult> {
    ...
  }

  getHeaders<T extends StringMap>(): T {
    ...
  }

  getPathParameters<T extends StringMap>(): T {
    ...
  }

  getQueryStringParameters<T extends StringMap>(): T {
    ...
  }

  getBody<T>(): T {
    ...
  }

}

export const functionalRestLambdaHandler = (
  e: APIGatewayProxyEvent,
  ctx: Context,
  handler: (
    event: APIGatewayProxyEvent,
    context: Context,
  ) => Promise<APIGatewayProxyResult>
) => {
  function arrowBind<T>(
    e: APIGatewayProxyEvent,
    ctx: Context,
    context: T,
    fn: (
      event: APIGatewayProxyEvent,
      context: Context,
    ) => Promise<APIGatewayProxyResult>
  ): typeof fn & T {
    let arrowFn;
    return function(e: APIGatewayProxyEvent, ctx: Context) {
      arrowFn = eval(fn.toString());
      return arrowFn(e, ctx);
    }.call({ e, ctx, context });
  }
  return arrowBind(e, ctx, { ...RestLambdaHandler }, handler);
};

当我在API处理程序中console.log离开this时,我看到了类成员属性(诸如headers属性之类的东西);但是,我看不到任何方法(诸如方法this.getHeaders()this.success()等)。

如何将RestLambdaHandler类中的所有方法绑定到处理程序方法中的this关键字?

编辑: 我最终只是做以下事情

export const createRestLambdaHandler = (
  event: APIGatewayProxyEvent,
  context: Context,
  handler: (...args: any[]) => Promise<APIGatewayProxyResult>
) => {
  class Handler extends RestLambdaHandler {}
  const restLambdaHandler = new Handler(event, context);
  return handler.call(restLambdaHandler);
};

这完成了我需要完成的工作,缺点是您不能使用箭头功能作为functionalRestLambdaHandler的回调。

0 个答案:

没有答案