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

What happens when a Promise is returned from an async function?

如果函数returns a Promise and被标记为async,它是否返回Promise<Promise<DoWorkResponse>>

tslint 告诉我应该将函数标记为异步。我担心我以某种方式双重包装 Lambda 客户端 returns.

的承诺
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);
    });
};

没关系,实际上异步函数将 return 值转换为一个 promise,如果重新运行的值还不是一个 promise。如果它已经是一个承诺,它将 returned 不变

is it returning Promise<Promise<DoWorkResponse>>?

不,Promise 永远不会解析为 promise。如果它得到 resolve()d 的承诺,承诺将解析为承诺值,从异步函数返回时也会发生同样的情况。但是,您实际上可以在此处使用 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);    
}