【问题标题】:How to resolve Javascript error '.then is not a function'?如何解决 Javascript 错误“.then 不是函数”?
【发布时间】:2019-10-18 14:49:13
【问题描述】:

以下代码从 S3 获取 csv 数据并将其转换为 JSON。 我收到.then is not a function 以下错误。可能是什么问题?

var Papa = require('papaparse');
var AWS = require('aws-sdk')

let deferred = this.$q.defer();
s3.getObject(params, function (err, data) {
      if (err) {
        //console.log(err, err.stack);
        deferred.reject(err);
      }
      else {
        const csv = data.Body.toString('utf-8');
        const headers = 'id,start,end,count';
        const parsed = Papa.parse(headers + '\n' + csv, parseOptions);
        var parsedData = parsed.data;
        console.log(parsedData); //this works

        deferred.resolve(parsedData);  // resolve the deferred with the data
      }
      return deferred.promise;
    }).then(function(parsedData) {
      console.log(parsedData);

    }).catch( function(err) {
      console.log(err, err.stack);
    });

  }

【问题讨论】:

  • 如果您将回调函数传递给s3.getObject(),我敢打赌它不会返回 Promise。不要混合两种风格;将回调代码也放入.then()

标签: javascript node.js angularjs callback


【解决方案1】:
s3.getObject(params, function (err, data) {
   ...
   return deferred.promise;
}).then(function(parsedData) {
  ...
})

s3.getObject() 似乎是一个不返回承诺的回调式 API。当然,它的 回调 似乎是,但 getObject() 函数本身没有。

您需要做的是转换s3.getObject() 以返回一个承诺。 Node 有utils.promisify(),它将采用回调风格的 API 并返回该函数的一个版本,该函数返回一个承诺。您可能可以这样做:

const util = require('util')

const getObject = util.promisify(s3.getObject)

getObject(params)
  .then(function(parsedData){
    ...
  })

【讨论】:

    【解决方案2】:

    aws-sdk.js 最初是用回调编写的,后来它们引入了 Promise。 您只需将.promise() 添加到您的getObject 和您的固定位置。

    这是一个例子:

    s3
    .getObject(params)
    .promise()
    .then(data => {
      const csv = data.Body.toString('utf-8');
      const headers = 'id,start,end,count';
      const parsed = Papa.parse(headers + '\n' + csv, parseOptions);
      return parsed.data
    })
    .catch(err => {
      console.log(err, err.stack);
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-28
      • 2020-07-25
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-02
      相关资源
      最近更新 更多