Azure函数-等待context.log

时间:2019-04-17 07:48:35

标签: typescript azure async-await azure-functions

在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;
    }
}

1 个答案:

答案 0 :(得分:1)

您的原始代码正在将then / catchasync混合:

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);
}