如何将对象从使用PouchDB的工厂返回到控制器
How to return an object to the controller from a factory that uses PouchDB
我创建了一个angularJS工厂,用于插入IndexedDB并从中获取一些值。我可以成功地将值插入IndexedDB。但是,当我试图从DB中获取值并将其传递给控制器时,我会遇到问题。
factory.getAllProgressData = function() {
var dbOptions = {};
dbOptions.include_docs = true;
var output = {};
var result = {};
pouchDb.allDocs(dbOptions, function(err, res) {
if (err)
console.log(err);
if(res) {
output.weight = getWeightValues(res.rows);
console.log(output); // <== This console line prints the object
}
});
console.log(output); // <== This console line does NOT print the object
return output;
};
var getWeightValues = function(rows) {
var weightValues = [];
for (var i = 0; i < rows.length; i++) {
weightValues.push(rows[i].doc.Weight);
};
return weightValues;
};
正如您在代码的注释中所看到的,当我将对象打印到控制台的第一个位置时,它就会打印出来。但当我试着在下面做的时候,它不会打印出来。返回值也是空的。我对javascript很陌生,这种行为我不清楚。我希望结果对象返回到Controller
。请帮忙。提前谢谢。
只是猜测,但答案可能是因为pouchDb.allDocs
是一个异步函数。这可能是一个学习编写异步JavaScript(又名AJAX)的好机会。AJAX对于那些刚接触JavaScript的人来说是一个很难理解的概念。
例如,您应该能够清楚地了解打印到控制台的内容以及以下代码中的顺序:
function printB() { console.log('B'); }
console.log('A');
setTimeout(printB, 10);
console.log('C');
答案是ACB,而不是ABC,也不是BAC。如果你明白为什么,你就可以很好地回答自己的问题了。
一个稍微相关的例子:
var a = 'A';
function changeAtoB() { a = 'B'; console.log(a); }
console.log(a);
setTimeout(changeAtoB, 10);
console.log(a);
答案是AAB,而不是ABA,原因与前面的例子相同。此外,请注意,setTimeout做了一件特定的事情,但它是异步函数概念的一个很好的一般介绍性示例。
为了更直接地解决您的问题,第二个示例对应于为什么您的输出变量可能是为console.log的一个调用而定义的,而不是为另一个调用。
相关文章:
- 工厂返回数据后未设置角度$scope
- 从角度工厂返回数据,返回对象后填充数据
- AngularJS:从工厂返回配置
- 努力将结果从工厂返回到范围
- 控制器未从工厂返回数据
- 角度控制器/工厂返回未定义的对象
- JavaScript 对象原型未通过工厂返回
- 从工厂返回控制器$http承诺时未定义
- 离子平台准备就绪后,从棱角分明的工厂返回
- 如何将对象从使用PouchDB的工厂返回到控制器
- AngularJS工厂返回类型未定义
- angularjs从工厂返回数组
- Angular JS,工厂返回数据,但在控制器中它消失了
- Ionic角工厂返回undefined
- 如何在angularjs中使用http get从工厂返回业务对象
- 在Angular中从工厂返回响应到控制器
- AngularJS从工厂返回值到控制器
- AngularJS工厂返回State对象,而不是promise中的JSON数据
- Angular工厂返回index.html作为响应.data而不是JSON
- 不能使用AngularJS工厂返回的数据