Azure Table 存储 return 查询结果

Azure Table Storage return query results

我正在尝试创建一个 Azure 函数,它将接受参数和 return 存储在 Azure Table 中的值。我认为我遇到的问题与 javascript 的关系比与 Azure Table SDK 的关系更大。

您应该如何 return 通过 http 响应从查询中获取值?我附上了代码的副本,它应该解释我感到困惑的地方。我的主要困惑是因为我能够调用 context.log() 但无法从查询方法中的函数调用 context.res{}

我知道范围与它有关,但在 javascript 和嵌套函数方面我不是专家。一些指导或示例将不胜感激

var azure = require('azure-storage');
module.exports = function (context, req) {
    context.log('Some Function');
    var hostUri = 'https://*******.table.core.windows.net'
    var sasToken = 'abc123'

    if (req.query.value) {
        var tableService = azure.createTableServiceWithSas(hostUri, sasToken)
        var nothing =  tableService.retrieveEntity('Table', 'Partition', 'Row', function(error, result, response) {
            if (!error) {
                context.log('I am able to send data to the logs here')         
                context.res = {
                    status: 200,
                    body: "This is what I am tring to return -> " + JSON.stringify(result) 
                };       
            }
        })
        context.res = {
            status: 200,
            body: "I'm able to get a response here"
        };  
    }
    else {
        context.res = {
            status: 400,
            body: "Somthing went wrong..."
        };
    }
    context.done();
};

先解决:

if (req.query.value) {
    var tableService = azure.createTableServiceWithSas(hostUri, sasToken)
     tableService.retrieveEntity('Table', 'Partition', 'Row', function(error, result, response) {
        if (!error) {
            context.log('I am able to send data to the logs here')         
            context.res = {
                status: 200,
                body: "This is what I am tring to return -> " + JSON.stringify(result) 
            }; 
        }
        else{
            context.res = {
                status: 400,
                body: error
            };
        }
        context.done(); 
    })

}
else {
    context.res = {
        status: 400,
        body: "Value is empty"
    };
    context.done();
}

解释:

让我们将context.res标记为c1和c2以避免冗余。

你被回调函数捕获了。回调 function(error, result, response){} 直到从远程服务器检索到实体(或发生错误)后才会执行。这个操作可能需要一些时间,程序在等待它完成的同时继续执行,这种模式称为asynchronous

所以回调中的代码片段 c1 不会立即执行,而是 c2 会立即执行。然后 context.done(); 运行s 在检索到实体之前(您会看到响应消息 I'm able to get a response here),因此永远不会调用回调。

callback中应该包含依赖callback结果的代码,这样才能在callback结束后立即执行。将 context.done(); 放在回调和 else 段中,以确保它不会提前 运行。

还有一个blog about asynchronous-javascript供大家参考