我在从父/外部作用域的回调函数中访问值时遇到麻烦。基本上,我想访问以下s3.getObject()
函数获取的数据,并将其用于外部作用域(最后一行)。
我有以下JavaScript代码可从AWS提取一些数据:
const Papa = require('papaparse');
const AWS = require('aws-sdk')
AWS.config.update({
//ids
})
const s3 = new AWS.S3()
/* actual parameters should go here */
const params = {
Bucket: "test-ashish-2019",
Key: "dummy.csv"
};
const parseOptions = {
header: true,
dynamicTyping: true
}
s3.getObject(params, function(err, data) {
if (err) console.log(err, err.stack);
// else {console.log(data)};
else {
const csv = data.Body.toString('utf-8');
const headers = 'id,start,end,count';
const parsed = Papa.parse(headers + '\n' + csv, parseOptions);
var csvdata = parsed.data;
console.log(csvdata); //this is working as expected
}
});
console.log(csvdata); //not working as expected
如何使最后一行有效?
答案 0 :(得分:0)
您无法在回调范围之外访问该变量,因为回调是异步发生的(实际上,您的最后一行实际上是在回调设置csvdata
之前被调用的。)
您必须沿着诺言链传递这些数据(或使用async / await)以在回调上下文之外使用它。
答案 1 :(得分:0)
您的问题是您的代码在调用回调之前立即执行,并且s3.getObject返回一个Promise,因此您可以通过以下方式利用Promise:
将代码重构为此:
const getS3Object = async () => {
const data = await s3.getObject(params);
const csv = data.Body.toString('utf-8');
const headers = 'id,start,end,count';
const parsed = Papa.parse(headers + '\n' + csv, parseOptions);
var csvdata = parsed.data;
console.log(csvdata); //this is working as expected
}
console.log(csvdata); //will work