Javascript 如何在外部作用域中访问回调函数返回的值?

Javascript 如何在外部作用域中访问回调函数返回的值?,javascript,node.js,function,callback,closures,Javascript,Node.js,Function,Callback,Closures,从父/外部范围的回调函数中访问值时遇到问题。基本上,我想访问下面的s3.getObject()函数获取的数据,并在外部范围(最后一行)中使用它 我使用以下javascript代码从AWS获取一些数据: const Papa = require('papaparse'); const AWS = require('aws-sdk') AWS.config.update({ //ids }) const s3 = new AWS.S3() /* actual parameters

从父/外部范围的回调函数中访问值时遇到问题。基本上,我想访问下面的
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

如何使最后一行工作?

您无法访问回调范围之外的变量,因为回调是异步进行的(您的最后一行实际上是在回调设置
csvdata
之前被调用的)


您必须沿承诺链传递该数据(或使用async/await)才能在回调上下文之外使用它。

您的问题是,在调用回调之前,代码立即执行,s3.getObject返回一个承诺,因此您可以通过以下方式利用该承诺:

将代码重构为:

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