Функции Azure - ожидание context.log - PullRequest
0 голосов
/ 17 апреля 2019

Я вижу много следующего, когда выполняю context.log в своем триггере с синхронизацией по функциям Azure:

Предупреждение: неожиданный вызов 'log' для объекта контекстапосле выполнения функции.Пожалуйста, проверьте асинхронные вызовы, которые не ожидаются, или вызовы «done», выполненные до завершения выполнения функции

Я думаю, что это происходит, потому что возврат вызывается до того, как 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 Ответ

1 голос
/ 18 апреля 2019

Ваш исходный код смешивался 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);
}
...