为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

三国纷争 2021-11-25 16:34:48
我在实现 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 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

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


  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

}


查看完整回答
反对 回复 2021-11-25
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

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

});


查看完整回答
反对 回复 2021-11-25
  • 2 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信