Как устранить ошибку Javascript «. Тогда это не функция»? - PullRequest
0 голосов
/ 18 октября 2019

Следующий код извлекает данные CSV из S3 и преобразует их в 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 голосов
/ 18 октября 2019

aws-sdk.js изначально был написан с обратными вызовами, а позже они вводили обещания. Вам просто нужно добавить .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);
})
0 голосов
/ 18 октября 2019
s3.getObject(params, function (err, data) {
   ...
   return deferred.promise;
}).then(function(parsedData) {
  ...
})

s3.getObject() представляется API-интерфейсом в стиле обратного вызова, который НЕ возвращает обещание. Конечно, это обратный вызов , кажется, но сама функция getObject() этого не делает.

Что вам нужно сделать, это преобразовать s3.getObject(), чтобы вернуть обещание. Узел имеет utils.promisify(), который будет принимать API в стиле обратного вызова и возвращать версию этой функции, которая возвращает обещание. Вы, вероятно, можете сделать:

const util = require('util')

const getObject = util.promisify(s3.getObject)

getObject(params)
  .then(function(parsedData){
    ...
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...