在Azure函数-定时触发器中执行context.log
时,我看到很多以下内容:
警告:函数执行完成后,意外地调用了上下文对象上的'log'。请检查未等待的异步调用或在函数执行完成之前进行的“完成”调用
我认为之所以会这样,是因为在context.log
完全执行之前就调用了返回。
但是有人可以确认/帮助解释。
export async function onTrigger(context: Context, myTimer: any): Promise<void> {
async getJobs(context);
}
async function getJobs(context: Context): Promise<void> {
try {
const response = await axios.get("http://localhost:8111/batches");
processBatch(context, response);
} catch (error) {
context.log.error(`Some Error Log`, error);
}
}
async function processBatch(context: Context, response: any) {
//… Some stuff
if (stableStates.includes(someStatus)) {
context.log("Some Message")
return;
}
}
答案 0 :(得分:1)
您的原始代码正在将then
/ catch
与async
混合:
async function getJobs(context: Context): Promise<void> {
axios
.get("http://localhost:8111/batches")
.then(function(response: any) {
processBatch(context, response);
})
.catch(function(error: any) {
context.log.error(`Some Error Log: `, error);
});
}
上面的代码(axios.get(..).then(..).catch(..)
)将创建一个Promise
,但该诺言永远不会返回;它只是被忽略。同时,另一个承诺是由async
创建的,该承诺是在创建(未完成)之后完成的。
您应始终使用async
/ await
:
async function getJobs(context: Context): Promise<void> {
try {
const response = await axios.get("http://localhost:8111/batches");
processBatch(context, response);
} catch (error) {
context.log.error(`Some Error Log: `, error);
}
}
此外,您在这里缺少await
:
export async function onTrigger(context: Context, myTimer: any): Promise<void> {
getJobs(context);
}
应为:
export async function onTrigger(context: Context, myTimer: any): Promise<void> {
await getJobs(context);
}