Javascript 如何使用AngularJS$q从异步函数返回数据?
我在实现AngularJS$q以从异步函数获取数据并在外部作用域中使用它时遇到了一些问题。基本上,我想让最后一行在下面的代码中工作。 我已经看到了一些示例,但似乎无法理解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')
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;//重要!返回承诺,而不是数据
}嗨,我得到了
。那么这不是一个函数错误。