javascript - “异步”Azure Function App 未按预期等待

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

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

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

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

Creating table 'Test'.
[warn] Warning: Unexpected call to 'log' on the context object after function execution has completed. Please check for asynchronous calls that are not awaited or calls to 'done' made before function execution completes.



所以看起来,虽然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)
        }
    });
}

最佳答案

你可以返回一个它会起作用的 promise 。并在使用 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)
        }
    });
});
}

关于javascript - “异步”Azure Function App 未按预期等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54944356/

相关文章:

javascript - JavaScript 中的电子邮件验证

javascript - 尝试从JavaScript中的XML解析所有数据

javascript - 使用 javascript 更新文本框

node.js - 有什么建议可以缩短 npm 在 teamcity 中的安装时间

javascript - 等待所有 nodeJS 请求完成并为它们添加一点延迟

javascript - 如何在我的任务代码运行之前*从我的自定义任务中调用其他任务?

javascript - Typescript:使用 AMD 时如何关闭环境声明

linux - 如何在脚本中使用ARM模板创建HDI集群时在scriptAction中提供多个变量

azure - 以编程方式创建 Azure KeyVault secret 时,如何修复 "Operation ' set' not allowed"错误?

php - Windows Azure 社区的 PHP 在哪里?