javascript - 无法弄清楚如何将数据异步推送到数组
问题描述
这是我编写的一个函数,用于检索我存储在 S3 存储桶中的文件的元数据。
它将存储桶中所有文件的键存储在一个数组中,然后遍历该数组以获取每个单独文件的元数据。问题是我存储值的元数据数组总是空的。
我在值被推入数组的位置之后立即输入了一个打印语句,并且该数组似乎被很好地填充,但是当我在该循环之外打印它时它打印为空。
我发现这是因为元数据被异步获取,并且数组显示为空,因为我在它实际填充值之前打印它。但我似乎无法弄清楚如何将值异步存储在数组中。一些帮助将不胜感激。
exports.allMetadata = (req, res) => {
const params = {
Bucket: env.Bucket
}
var metadata = [];
s3.listObjectsV2(params, (err, data) => {
if (err) {
console.log(err, err.stack);
res.send("error -> "+ err);
} else {
var contents = data.Contents;
contents.forEach(content => {
const params1 = {
Bucket: env.Bucket,
Key: content.Key
};
s3.headObject(params1, (err, data) => {
if (err) {
console.log(err, err.stack);
res.send("error -> "+ err);
} else {
metadata.push(data.Metadata);
console.log(metadata); //Prints fine
}
});
});
console.log(metadata); //Shows empty here
//res.send(metadata);
}
});
}
解决方案
正如您所说,这s3.headObject
是一个异步操作,因此您需要在将响应发送给客户端之前等待它们:
exports.allMetadata = (req, res) => {
const params = {
Bucket: env.Bucket
}
s3.listObjectsV2(params, (err, data) => {
if (err) {
console.log(err, err.stack)
res.send('error -> ' + err)
return
}
var contents = data.Contents
const promiseArray = contents.map(content => {
const params1 = {
Bucket: env.Bucket,
Key: content.Key
}
return readS3Meta(params1)
})
// WARN: the array should be not HUGE
Promise.all(promiseArray)
.then((allMetadata) => {
console.log(allMetadata)
res.send(allMetadata)
})
.catch(err => {
res.send('error -> ' + err)
})
})
}
function readS3Meta (params1) {
return new Promise((resolve, reject) => {
s3.headObject(params1, (err, data) => {
if (err) {
console.log(err, err.stack)
reject(err)
return
}
resolve(data.Metadata)
})
})
}
推荐阅读
- c - 未定义对带有 Kinetis KL25Z 板和 Codewarrior IDE 的“strftime”的引用
- php - WAMP/Wordpress - cURL 错误 28:操作在 10001 毫秒后超时,收到 0 个字节
- excel - VBA Excel:以编程方式创建和放置 100 个按钮并设置背景颜色
- java - 如何通过 Java 开发工具包设置 AWS S3 对象重定向
- mysql - Microsoft Access:从表单更改单行中的单列值
- mysql - MySQL 查询通过加入 4 个不同的表来创建数据透视表
- python - 更改 2D 列表中的所有列
- pine-script - 如何在 Pine Script 中用字符串编写变量?
- python - TypeError: searchsorted 需要兼容的 dtype 或标量,而不是 ndarray (Pandas)
- python - Google Appengine 数据存储区 - 无法使用不同的列进行排序