如何读取 Angularjs 中工厂中的文件数组?
How to read array of files in a factory in Angularjs?
我有一组文件。我想阅读所有这些内容并从中制作一个 json 数组。问题是 d3.csv
是一个异步函数。
从 问题中,我了解到 $q.defer()
必须用于向控制器返回延迟承诺。
我的问题是我必须读取文件数组并制作相应的对象数组。
目前的代码如下:
myApp.factory('myFactory', function($q) {
var masterData=[];
var visFolder = "/data/";
var files=[(visFolder + "Crime_full1.csv"),(visFolder + "accidents.csv"),(visFolder + "health.csv")];
return {
// Get all masterData
get: function() {
var deferred = $q.defer();
//I want to read all the files in array
d3.csv(files[0], function(d) {
masterData.push(d);
deferred.resolve(masterData);
console.log("a csv file read");
});
return deferred.promise;
}
}
});
myApp.controller('visCtrl', function($scope, $routeParams,myFactory) {
myFactory.get().then(function(masterData) {
//masterdata should contain data of all the files in an array
$scope.masterData = masterData;
});
});
您必须遍历文件数组并调用为每个文件调用 d3 库的函数。这个功能应该return承诺。下面的 getFile
函数执行相同的操作:
getFile = function (file) {
var deferred = $q.defer();
d3.csv(file, function (d) {
deferred.resolve(d);
});
return deferred.promise;
}
getFile
函数定义在 return 块之外。 get
函数现在必须更新为对每个文件调用 getFile
,然后用 $q.all
整理结果。代码看起来像这样。
get: function () {
var promises = files.map(function (f) {
return getFile(f);
});
return $q.all(promises).then(function (data) {
data.forEach(function (f) {
masterData.push(f);
});
return masterData;
});
}
我有一组文件。我想阅读所有这些内容并从中制作一个 json 数组。问题是 d3.csv
是一个异步函数。
从 $q.defer()
必须用于向控制器返回延迟承诺。
我的问题是我必须读取文件数组并制作相应的对象数组。
目前的代码如下:
myApp.factory('myFactory', function($q) {
var masterData=[];
var visFolder = "/data/";
var files=[(visFolder + "Crime_full1.csv"),(visFolder + "accidents.csv"),(visFolder + "health.csv")];
return {
// Get all masterData
get: function() {
var deferred = $q.defer();
//I want to read all the files in array
d3.csv(files[0], function(d) {
masterData.push(d);
deferred.resolve(masterData);
console.log("a csv file read");
});
return deferred.promise;
}
}
});
myApp.controller('visCtrl', function($scope, $routeParams,myFactory) {
myFactory.get().then(function(masterData) {
//masterdata should contain data of all the files in an array
$scope.masterData = masterData;
});
});
您必须遍历文件数组并调用为每个文件调用 d3 库的函数。这个功能应该return承诺。下面的 getFile
函数执行相同的操作:
getFile = function (file) {
var deferred = $q.defer();
d3.csv(file, function (d) {
deferred.resolve(d);
});
return deferred.promise;
}
getFile
函数定义在 return 块之外。 get
函数现在必须更新为对每个文件调用 getFile
,然后用 $q.all
整理结果。代码看起来像这样。
get: function () {
var promises = files.map(function (f) {
return getFile(f);
});
return $q.all(promises).then(function (data) {
data.forEach(function (f) {
masterData.push(f);
});
return masterData;
});
}