猿问

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

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

    });


  }


摇曳的蔷薇
浏览 868回答 2
2回答

手掌心

s3.getObject(params, function (err, data) {   ...   return deferred.promise;}).then(function(parsedData) {  ...})s3.getObject()似乎是不返回承诺的回调式 API。当然,它的回调似乎是,但getObject()函数本身却没有。您需要做的是转换s3.getObject()以返回承诺。Node 有utils.promisify()which 将采用回调风格的 API 并返回该函数的一个版本,该版本返回一个承诺。你可能可以这样做:const util = require('util')const getObject = util.promisify(s3.getObject)getObject(params)  .then(function(parsedData){    ...  })

杨魅力

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);})
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答