Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用AngularJS$q从异步函数返回数据?_Javascript_Node.js_Angularjs_Asynchronous_Promise - Fatal编程技术网

Javascript 如何使用AngularJS$q从异步函数返回数据?

Javascript 如何使用AngularJS$q从异步函数返回数据?,javascript,node.js,angularjs,asynchronous,promise,Javascript,Node.js,Angularjs,Asynchronous,Promise,我在实现AngularJS$q以从异步函数获取数据并在外部作用域中使用它时遇到了一些问题。基本上,我想让最后一行在下面的代码中工作。 我已经看到了一些示例,但似乎无法理解AngularJS$q实现 var app = angular.module("myShoppingList", []); app.controller("myCtrl", function ($scope, $q) { const Papa = require('papaparse')

我在实现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

        });

Deferred用于将回调函数转换为承诺函数

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);
});

上面的答案需要一个小的编辑,返回语句应该在函数的末尾

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
}
函数getS3Data(){ let deferred=$q.deferred(); s3.getObject(参数、函数(错误、数据){ 如果(错误){ //日志(err,err.stack); 延迟。拒绝(错误); } 否则{ 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);//这很有效 //return parsedData;//不返回数据 deferred.resolve(parsedData);//使用数据解析延迟的 } }); return deferred.promise;//重要!返回承诺,而不是数据
}嗨,我得到了
。那么这不是一个函数错误。