【问题标题】:'async' Azure Function App not awaiting as expected“异步”Azure Function App 未按预期等待
【发布时间】:2019-03-01 12:07:41
【问题描述】:

我正在尝试使用 Azure 存储 SDK for node 在表格存储中创建一个表格,如果它不存在的话。

以下代码有效,返回200响应,虽然没有响应内容。但是,该表已按预期创建。

经过调查,我可以看到 Azure Function 应用程序正在记录以下内容 -

创建表“测试”。
[警告] 警告:函数执行完成后对上下文对象的“日志”意外调用。请检查未等待的异步调用或在函数执行完成之前对“完成”的调用。

所以看起来虽然createTableInTableStore 按预期工作,但我的函数的 async/await 部分却没有。我怀疑我做错了什么,但从外观上看,我在需要时正确实现了await

如何让函数等待createTableInTableStore 方法完成后再继续?

示例代码

请注意,需要 azure-storage npm 包 (npm install azure-storage)。

module.exports = async function (context) {
    var azure_storage = require('azure-storage');
    var table_service = azure_storage.createTableService(process.env["AzureWebJobsStorage"]);
    var create_table_result = await createTableInTableStore(context, table_service, "Test");
    return {
        res: create_table_result
    };
};

async function createTableInTableStore(context, table_service, table_name) {
    context.log("Creating table '"+table_name+"'.");
    return await table_service.createTableIfNotExists(table_name, function(error, result, response) {
        if (!error && result) {
            context.log.info("[Info] Table created successfully.")
        } else if (!error && !result) {
            context.log.info("[Info] Table already exists.")
        }
        if (error) {
            context.log.error("[Error] An unexpected error occurred.")
            context.log.error(" -----> " + response)
        }
    });
}

【问题讨论】:

  • 我不确定您是否需要这两个 await 语句,所以您是否尝试删除第二个? table_service.createTableIfNotExists 返回一个承诺?
  • 请参阅下面接受的答案 - 我猜它没有返回承诺,我误解了 await 会做什么。谢谢。

标签: javascript node.js azure async-await azure-functions


【解决方案1】:

你可以返回一个它会起作用的承诺。并在使用 await 时使用 try catch 处理错误。

module.exports = async function (context) {
    try{
    var azure_storage = require('azure-storage');
    var table_service = azure_storage.createTableService(process.env["AzureWebJobsStorage"]);
    var create_table_result = await createTableInTableStore(context, table_service, "Test");
      return {
          res: create_table_result
      };
    }catch(err){
    //handle errr
    console.log(err);
     }
};

function createTableInTableStore(context, table_service, table_name) {
    context.log("Creating table '"+table_name+"'.");
    return new Promise((resolve, reject) => {
      table_service.createTableIfNotExists(table_name, function(error, result, response) {
        if (!error && result) {
            context.log.info("[Info] Table created successfully.")
            resolve(result)
        } else if (!error && !result) {
            context.log.info("[Info] Table already exists.")
            resolve(response)
        }
        if (error) {
            context.log.error("[Error] An unexpected error occurred.")
            context.log.error(" -----> " + response)
            reject(error)
        }
    });
});
}

【讨论】:

  • 非常感谢,这似乎可以完成这项工作。我认为使用 await 时会自动创建承诺,所以这就是我出错的地方 - 下次我会知道的更好!
  • @DavidGard 异步函数确实会返回 Promise。这里的问题可能是别的。此外,如果您没有在内部使用await,则将函数标记为async 是没有意义的。您的原始代码正在等待一个不返回承诺的函数。table_service.createTableIfNotExists 是基于回调的,而不是基于承诺的。如果您希望能够使用 async/await,您需要承诺它,就像这个答案一样(除了它不需要标记为异步)。
猜你喜欢
  • 2011-12-15
  • 2019-04-09
  • 2019-04-19
  • 2020-03-04
  • 2019-04-07
  • 1970-01-01
  • 2022-01-22
  • 2018-12-02
  • 1970-01-01
相关资源
最近更新 更多