从异步函数返回Promise时会发生什么?

时间:2019-01-10 17:34:14

标签: javascript amazon-web-services lambda async-await aws-sdk

如果函数返回Promise 并标记为async,它是否返回Promise<Promise<DoWorkResponse>>

tslint告诉我应该将功能标记为异步。我担心我会以某种方式双重包装Lambda客户返回的承诺。

const doWork = async (event: MyEvent): Promise<DoWorkResponse> => {
  return new Lambda({ region: process.env.region })
    .invoke({
      FunctionName: process.env.doWorkLambdaName,
      InvocationType: 'RequestResponse',
      LogType: 'Tail',
      Payload: JSON.stringify(event),
    })
    .promise()
    .then((response: Lambda.InvocationResponse) => {
      if (response.StatusCode !== 200) {
        const errorMessage = `Error occurred invoking DoWork Lambda. ${response}`;
        console.error(errorMessage);
        throw new Error(errorMessage);
      }
      return JSON.parse(response.Payload as string);
    });
};

2 个答案:

答案 0 :(得分:3)

没关系,如果重新运行的值还不是一个Promise,实际上Async函数会将返回值转换为一个Promise。如果已经是一个承诺,它将原封不动地退还

答案 1 :(得分:1)

  

返回Promise<Promise<DoWorkResponse>>吗?

不,一个承诺永远不会兑现承诺。如果它获得resolve() d的Promise,则Promise将解析为Promise值,从异步函数返回时也会发生同样的情况。但是,您实际上可以在此处使用await来稍微平整代码:

 async function doWork (event: MyEvent): Promise<DoWorkResponse> {
   const response = await new Lambda({ region: process.env.region })
    .invoke({
      FunctionName: process.env.doWorkLambdaName,
      InvocationType: 'RequestResponse',
      LogType: 'Tail',
      Payload: JSON.stringify(event),
    })
    .promise();

   if (response.StatusCode !== 200) {
     const errorMessage = `Error occurred invoking DoWork Lambda. ${response}`;
     console.error(errorMessage);
     throw new Error(errorMessage);
   }

   return JSON.parse(response.Payload as string);    
}