如何使用 AngularJS $q 延迟承诺从异步函数返回数据?

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


        });



三国纷争
浏览 130回答 2
2回答

至尊宝的传说

上述答案需要进行一个小的编辑,返回语句应该在函数的末尾。  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}

饮歌长啸

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);});
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript