【问题标题】:How to access value returned by a callback function in outer scope? [duplicate]如何访问外部范围内的回调函数返回的值? [复制]
【发布时间】:2020-02-14 13:56:39
【问题描述】:

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

如何使最后一行工作?

【问题讨论】:

    标签: javascript node.js function callback closures


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您的问题是您的代码在调用回调之前立即执行并且 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多