从异步函数返回 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);
}
如果函数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);
}