如何解决Javascript错误“ .then不是函数”?

时间:2019-10-18 14:49:13

标签: javascript node.js angularjs callback

以下代码是从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);
    });

  }

2 个答案:

答案 0 :(得分:0)

s3.getObject(params, function (err, data) {
   ...
   return deferred.promise;
}).then(function(parsedData) {
  ...
})

s3.getObject()似乎是一种回调样式的API,不会返回承诺。当然,它看起来是回调,但是getObject()函数本身却没有。

您需要做的是转换s3.getObject()以返回承诺。 Node具有utils.promisify(),它将使用回调样式的API并返回该函数的版本,该版本返回promise。您可能可以做到:

const util = require('util')

const getObject = util.promisify(s3.getObject)

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

答案 1 :(得分:0)

aws-sdk.js最初是用回调编写的,后来又引入了promises。 您只需要做的是将.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);
})