我正在尝试创建一个Azure函数,该函数将接受参数并返回存储在Azure表中的值。我认为与javascript有关的问题比与Azure Table SDK有关的问题更多。
您应该如何通过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();
};
答案 0 :(得分:1)
第一个解决方案:
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();
在检索实体之前运行(您会看到响应消息I'm able to get a response here
),因此永远不会调用回调。
依赖于回调结果的代码应包含在回调中,以便可以在回调完成后准确执行。将context.done();
放在回调和else段中,以确保它不会提前运行。
还有一个blog about asynchronous-javascript供您参考。