代码之家  ›  专栏  ›  技术社区  ›  David Gard

“异步”Azure函数应用程序未按预期等待

  •  0
  • David Gard  · 技术社区  · 7 年前

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

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

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

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

    看来 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)
            }
        });
    }
    
    0 回复  |  直到 7 年前
        1
  •  8
  •   empz    6 年前

    你可以回报一个承诺,它会起作用。当使用wait时,使用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)
            }
        });
    });
    }