【问题标题】:How to return an object to the controller from a factory that uses PouchDB如何从使用 PouchDB 的工厂将对象返回给控制器
【发布时间】:2014-10-31 03:47:00
【问题描述】:

我创建了一个 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;
    };

正如您在代码的 cmets 中看到的,当我将对象打印到控制台时,它首先打印。但是当我尝试在下面这样做时,它不会打印。而且返回值也是空的。我对 javascript 很陌生,这种行为对我来说并不清楚。我希望将结果对象返回到Controller。请帮忙。提前致谢。

【问题讨论】:

  • this 有帮助吗?

标签: javascript angularjs promise indexeddb pouchdb


【解决方案1】:

只是猜测,但也许答案是因为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 而不是另一次定义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 2016-09-04
    • 2021-11-22
    • 1970-01-01
    相关资源
    最近更新 更多