Что происходит, когда Promise возвращается из асинхронной функции? - PullRequest
0 голосов
/ 10 января 2019

Если функция возвращает 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 голосов
/ 10 января 2019

это возвращается Promise<Promise<DoWorkResponse>>?

Нет, обещание никогда не разрешится. Если он получает resolve() d с обещанием, то 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);    
}
0 голосов
/ 10 января 2019

Ничего страшного, фактически асинхронные функции преобразуют возвращаемое значение в обещание, если повторное значение уже не является обещанием. И если это уже обещание, оно будет возвращено без изменений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...