javascript - Lambda函数:尽管在函数内部将对象推送到它,但数组返回空
问题描述
我将以下代码用作在 API 调用上执行的 lambda 函数。
我遇到的问题是当response
和callback
处于当前位置时,即使扫描对象已填充并推送到数组,数组也会scans
返回。[]
但是,当response
和callback
放置在***PLACEHOLDER***
部分中时,数组返回填充了扫描对象。
我知道这与代码的异步性质有关,因为我在堆栈上查看了许多类似的问题,但除了 AWS-SDK 代码之外,我不知道该怎么做才能纠正它。
const AWS = require('aws-sdk');
const ddb = new AWS.DynamoDB.DocumentClient();
const iot = new AWS.Iot;
exports.handler = (event, context, callback) => {
iot.listThings(null, function(err, data) {
var scans = [];
if (err) {
callback(err, null);
}
else {
for (var i = 0; i < data.things.length; i++) {
var device = data.things[i].attributes;
const params = {
// redacted
};
ddb.query(params, function(err, data) {
if (err) {
callback(err, null);
}
else {
var scan = {
"area": device.area,
"count": data["Count"]
};
scans.push(scan);
// ***PLACEHOLDER***
}
});
}
}
var response = {
"statusCode": 200,
"headers": {},
"body": JSON.stringify(scans),
"isBase64Encoded": false
};
callback(null, response);
});
};
解决方案
这是一个异步问题,而不是 Lambda。您的代码应如下所示:
const AWS = require('aws-sdk');
const ddb = new AWS.DynamoDB.DocumentClient();
const iot = new AWS.Iot;
exports.handler = (event, context, callback) => {
iot.listThings(null, function(err, data) {
var scans = [];
if (err) {
callback(err, null);
}
else {
populateScans(data).then(res => {
callback(null,{
"statusCode": 200,
"headers": {},
"body": JSON.stringify(res),
"isBase64Encoded": false
})
}).catch(callback)
}
});
};
function populateScans(data) {
return Promise.all(data.things.map(thing => {
let device = thing.attributes
const params = {}
return ddb.query(params).promise().then(res => {
return {
area: device.area,
count: res["Count"]
}
})
}))
}
推荐阅读
- android - 我在启动 android studio 时遇到问题?
- javascript - 从 FileReader() 返回结果?
- python - 从导入的 python 脚本中访问导入的 python 包时出现 NameError
- c# - 为什么我的 raycast 在几秒钟后停止工作?
- sql - 如何仅使用 SQL 合并行?
- google-cloud-tpu - 在谷歌云控制台上打开 tpus 页面时出错
- asp.net-core - 如何使用查询字符串将自定义 url 设置为操作路由 .net 核心
- objective-c - 是否可以使用 VImage 检查两个捕获的帧之间的差异?
- android - 列表未使用改造进入 recyclerview
- c++ - 如何 CMake 将库编译为我的应用程序源的一部分,而不是作为静态/共享库?