我的数据存储在Firebase上。我有一个函数可以从Firebase获取信息并将其作为数组返回。我希望能够使用ng-csv将该文件下载为.csv但是当我下载时它是一个空文件。
如果我尝试从Firebase获取数据,是否可以使用ng-csv?如果有的话,是否有任何示例?
我正在尝试使用ng-csv来允许用户通过单击按钮来下载.csv文件。这些信息存储在Firebase中,我创建了一个函数,可以将Firebase中所需的信息作为数组返回。但是,我认为问题是在从Firebase提取信息并加载信息之前单击按钮文件时,因此.csv文件始终为空。有没有解决的办法?这是我的main.js应用程序中的代码:
this.export = function() {
var results = fireFactory.getResults() //code that returns the array of objects
results.$loaded().then(function(array) {
var test= [];
test.push(array[0]);
test.push(array[1]);
return test;
};
};
以下是我的HTML文件中的代码:
<button class ="btn" ng-csv="main.export()" filename="test.csv">Export</button>
是否有延迟文件下载,直到从main.export()函数加载并返回信息为止?
答案 0 :(得分:1)
你快到了。 Frank van Puffelen走在了正确的道路上,但没有为你的代码提供修复。
return test;
回调中的上述语句将结果返回到promise中。只有使用承诺感知代码才能使用此结果。幸运的是,ng-csv接受了承诺。如果承诺被退回,它应该有效:
this.export = function() {
var results = fireFactory.getResults()
//Here we return the promise for consumption by ng-csv
return results.$loaded().then(function(array) {
var test= [];
test.push(array[0]);
test.push(array[1]);
//the array is returned from the callback, not export
return test;
};
};
答案 1 :(得分:0)
您受到Firebase加载数据的异步性质的欺骗。您似乎认为原始代码中的return test;
会返回export
函数中的值。但是如果你仔细观察,你会注意到你实际上是从(匿名)回调函数返回的。
如果我们将回调函数分开并添加一些日志记录语句,它会更容易看到它:
function onDataLoaded(array) {
console.log('Got results from Firebase');
var test= [];
test.push(array[0]);
test.push(array[1]);
return test;
};
this.export = function() {
console.log('Starting to get results from Firebase');
var results = fireFactory.getResults() //code that returns the array of objects
console.log('Started to get results from Firebase');
results.$loaded().then(onDataLoaded);
console.log('Registered result handler');
};
当您致电fireFactory.getResults()
时,Firebase将开始从其服务器下载数据。由于这可能需要一些时间,因此下载是异步进行的,并且浏览器会继续执行导出功能,该功能会记录您希望在Firebase中的数据可用时调用的回调。
因此,您将在JavaScript控制台中看到以下输出:
开始从Firebase获取结果
开始从Firebase获取结果
注册结果处理程序
从Firebase获得结果