javascript - 如何使用 AngularJS $q 延迟 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'); //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

        });

最佳答案

上述答案需要进行一点小编辑,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
}

关于javascript - 如何使用 AngularJS $q 延迟 promise 从异步函数返回数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58451720/

相关文章:

javascript - 如何在 ion-slide-box 上隐藏点

javascript - 在javascript中设置对象数组的顺序

javascript - 使用菜单创建 Angular Material 导航栏

javascript - 带有可选第一个参数的表达包罗万象的路线

windows - Bamboo远程构建代理安装nodejs后找不到powershell.exe

javascript - Angular 点符号更好的解释

javascript - AngularJS:如何在选择中选择 Material 选择项/选项

javascript - 无法使用 Angular js将数据从json数据获取到纯文本(表)

javascript - 添加脚本引用后 HTML 不显示

node.js - 使用 Node js 进行 REST 调用 : "Error: connect ETIMEDOUT" and "http code 0"