“异步" Azure功能应用未按预期等待 [英] 'async' Azure Function App not awaiting as expected

查看:54
本文介绍了“异步" Azure功能应用未按预期等待的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm attempting to use the Azure storage SDK for node to create a Table in Table Store, if it does not exist.

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

The following code is valid and returns a 200 response, although there is no response content. However, the table is created as expected.

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

Upon investigation, I can see that the Azure Function app is logging the following -

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

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,何时需要它.

So it seems that while the createTableInTableStore is working as expected, the async/await part of my function is not. I suspect that I'm doing something wrong, but from the looks of it I am correctly implementing await as and when it's requried.

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

How can I get the function to wait for the createTableInTableStore method to complete before it move on?

请注意,需要azure-storage npm软件包(npm install azure-storage).

Please note that the azure-storage npm package is required (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时使用try catch处理错误.

you can return a promise it will work. and use try catch to handle errors when you use await.

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

这篇关于“异步" Azure功能应用未按预期等待的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆