arrays - 在 Node.js 中,在调试中填充了数组,但在正常模式下没有填充
问题描述
在下面的代码中,当我在调试模式下运行时,在这一行有一个断点:content.push(data.Body.toString());
我可以看到数据被插入到content
数组中。
但是,当我正常运行代码时,content
返回为空。
我怎样才能让它填充阵列以供下游使用?
var params = { Bucket: "thebucket", Prefix: "theprefix/" }
var content = [];
function getS3Data()
{
var s3 = new aws.S3();
s3.listObjects(params, function (err, data)
{
if (err) throw err; // an error occurred
else
{
var i;
for (i = 0; i < data.Contents.length; i++)
{
var currentValue = data.Contents[i];
if(currentValue.Key.endsWith(params.Prefix) == false)
{
var goParams = { Bucket: params.Bucket, Key: currentValue.Key };
s3.getObject(goParams, function(err, data)
{
if (err) throw err; //error
content.push(data.Body.toString());
});
};
};
}//else
});//listObjects
}//getS3Data
getS3Data();
console.log(content); //prints empty here when run in non-debug.
解决方案
行:
console.log(content)
在行之前执行:
content.push(data.Body.toString());
您作为第二个参数传递的函数s3.listObjects
将异步执行。如果要注销,content
则需要在回调函数含义内进行:
s3.listObjects(params, function (err, data) {
if (err) throw err;
else {
// ...
console.log(content)
}
});
更好的方法是实现getS3Data
with ,Promise
这样您就可以在确定完成对象列表后运行代码。
function getS3Data() {
return new Promise((resolve, reject) => {
if (err) {
reject(err)
} else {
const promises = []
for (const i = 0; i < data.Contents.length; i++) {
const currentValue = data.Contents[i];
if (currentValue.Key.endsWith(params.Prefix) == false) {
const goParams = { Bucket: params.Bucket, Key: currentValue.Key };
promises.push(new Promise((res, rej) => {
s3.getObject(goParams, function (err, data) {
if (err) {
rej(err); //error
} else {
res(data.Body.toString());
}
});
}));
}
}
Promise.all(promises).then(resolve);
}
});
}
getS3Data()
.then(result => { // this will actually be `content` from your code example
console.log(result);
}).catch(error => {
console.error(error);
})
推荐阅读
- katalon-studio - 我可以在邮件正文中添加一些 Katalon-Studio 控制台登录吗?
- python - 用于从 tkinter 中的按钮事件中弹出警报框的异常,无法找出问题的根源
- memory - Redis RSS 内存占用高
- javascript - 用于在 javascript 中查找动态字符串中字符的第二次出现的正则表达式
- c++ - 当 T 具有非平凡的析构函数时,类类型 T 的对象可以被常量初始化吗?
- reactjs - 没有浏览器支持录制视频
- sas - 如何对 Excel 文件中列出的数据集名称运行 Proc COMPARE
- objective-c - macOS 应用程序在 Mojave 中运行良好,但在 Catalina Beta 版中崩溃
- microsoft-teams - 在自适应卡片中单击操作按钮时选择消失
- php - 如何在php中删除多维数组的索引