“异步” Azure功能应用未按预期等待

时间:2019-03-01 12:07:42

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

我正在尝试使用Azure存储SDK for node在表存储中创建表(如果该表不存在)。

以下代码是有效的,并且返回200响应,尽管没有响应内容。但是,表已按预期创建。

经调查,我发现Azure Function应用正在记录以下内容-

  

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

因此,看来createTableInTableStore正常工作时,我函数的异步/等待部分却没有工作。我怀疑我做错了什么,但是从它的外观看,我正确地在需要时实施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)
        }
    });
}

1 个答案:

答案 0 :(得分:2)

您可以返回一个承诺,它将起作用。并在使用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);
     }
};

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