我创建了一个angularJS工厂,用于插入并从IndexedDB获取一些值。我可以成功地将值插入IndexedDB。但是当我试图从数据库中获取值并将其传递给控制器时,我遇到了问题。
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
。请帮忙。提前谢谢。
答案 0 :(得分:0)
猜测但也许答案是因为pouchDb.allDocs
是一个异步函数。这可能是您学习编写异步JavaScript(又称AJAX)的好机会。对于那些刚接触JavaScript的人来说,AJAX是一个难题。
例如,您应该能够清楚地了解打印到控制台的内容以及以下代码中的顺序:
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而不是另一次调用而定义的原因。