Javascript 如何从使用数据库的工厂将对象返回控制器

Javascript 如何从使用数据库的工厂将对象返回控制器,javascript,angularjs,promise,indexeddb,pouchdb,Javascript,Angularjs,Promise,Indexeddb,Pouchdb,我创建了一个angularJS工厂,用于插入IndexedDB并从中获取一些值。我可以成功地将这些值插入IndexedDB。但是,当我试图从数据库中获取值并将其传递给控制器时,我会遇到问题 factory.getAllProgressData = function() { var dbOptions = {}; dbOptions.include_docs = true; var output = {}; var result =

我创建了一个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非常陌生,这种行为对我来说并不清楚。我希望结果对象返回给控制器。请帮忙。提前感谢。

我只是猜测一下,但答案可能是因为backdb.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的调用定义的,而不是为另一个调用定义的。

有帮助吗?