【问题标题】:How to use AngularJS $q deferred promises to return data from an async function?如何使用 AngularJS $q 延迟承诺从异步函数返回数据?
【发布时间】:2019-10-19 02:36:24
【问题描述】:

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

        });

【问题讨论】:

    标签: javascript node.js angularjs asynchronous promise


    【解决方案1】:

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

      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
    }

    【讨论】:

      【解决方案2】:

      Deferred 用于将回调函数转为 Promise 函数。

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

      【讨论】:

      • 嗨,我收到了.then is not a function error
      猜你喜欢
      • 2013-09-11
      • 1970-01-01
      • 2022-01-26
      • 2016-03-18
      • 2016-08-08
      • 1970-01-01
      • 2017-05-08
      • 2015-03-08
      • 2016-06-22
      相关资源
      最近更新 更多