Как использовать AngularJS $ q отложенных обещаний вернуть данные из асинхронной функции? - PullRequest
0 голосов
/ 18 октября 2019

У меня проблемы с реализацией AngularJS $ q для получения данных из асинхронной функции и использования их во внешней области. По сути, я хочу, чтобы последняя строка работала в приведенном ниже коде. Я видел несколько примеров, но не могу обернуться вокруг реализации AngularJS $ q.

var app = angular.module("myShoppingList", []);
        app.controller("myCtrl", function ($scope, $q) {

            const Papa = require('papaparse'); //I know these won't work, just added to give context
            const AWS = require('aws-sdk')

            AWS.config.update({
                //keys go here
            })

            const s3 = new AWS.S3()


            /* actual parameters should go here */
            const params = {
                Bucket: "test-bucket-2019",
                Key: "dummy.csv"
            };

            const parseOptions = {
                header: true,
                dynamicTyping: true /* will assume numbers are actually numbers, yada yada */
            }

        let deferred = this.$q.defer(); //how to use this???


            function getS3Data() {
                s3.getObject(params, function (err, data) {
                    if (err) console.log(err, err.stack);
                    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
                    }
                    return parsedData;

                })


            }
          console.log(parsedData) //how to make this work

        });

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Для небольшого изменения, необходимого для вышеуказанного ответа, оператор возврата должен находиться в конце функции.

  function getS3Data() {
  let deferred = $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

      //return parsedData;  // do not return data
      deferred.resolve(parsedData);  // resolve the deferred with the data
    }
  });
 return deferred.promise;  // important! return the promise, NOT THE DATA
}
0 голосов
/ 18 октября 2019

Отложено используется для превращения функции обратного вызова в функцию обещания.

function getS3Data() {
  let deferred = $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

      //return parsedData;  // do not return data
      deferred.resolve(parsedData);  // resolve the deferred with the data
    } 

  });
  return deferred.promise;  // important! return the promise, NOT THE DATA
}

Когда вы вызываете функцию, вы должны определить .then()/.catch() функции:

getS3Data().then(function(parsedData) {
   console.log(parsedData);
}).catch(function(err) {
  console.log(err, err.stack);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...