如何解决 Javascript 错误“.then is not a function”?

How to resolve Javascript error '.then is not a function'?

提问人:azrael v 提问时间:10/18/2019 更新时间:10/18/2019 访问量:505

问:

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

  }
JavaScript 节点.js angularjs 回调

评论

2赞 Pointy 10/18/2019
如果你将回调函数传递给我,我敢打赌它不会返回 Promise。不要混用这两种风格;将回调代码放入 ALSO。s3.getObject().then()

答:

0赞 Joseph 10/18/2019 #1
s3.getObject(params, function (err, data) {
   ...
   return deferred.promise;
}).then(function(parsedData) {
  ...
})

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

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

const util = require('util')

const getObject = util.promisify(s3.getObject)

getObject(params)
  .then(function(parsedData){
    ...
  })
0赞 Yuri Khomyakov 10/18/2019 #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);
})