Javascript 使用AngularJS中PockDB的数据设置$scope变量的值

Javascript 使用AngularJS中PockDB的数据设置$scope变量的值,javascript,angularjs,angularjs-scope,promise,pouchdb,Javascript,Angularjs,Angularjs Scope,Promise,Pouchdb,我有一个AngularJS工厂 angular.module('app.factories', []) .factory('ProgressDBFactory', function () { var factory = {}; var pouchDb = new PouchDB('ProgressDB'); factory.getAllData = function() { var dbOptions = {}; dbOptions.in

我有一个AngularJS工厂

angular.module('app.factories', [])
.factory('ProgressDBFactory', function () {
    var factory = {};
    var pouchDb = new PouchDB('ProgressDB');

    factory.getAllData = function() {
        var dbOptions = {};
        dbOptions.include_docs = true;

        return pouchDb.allDocs(dbOptions).then(function(res) {
            return res.rows;
        });
    };

    return factory;
})
我需要将控制器中的$scope.progressData与来自数据库的数据一起设置。我的控制器看起来像这样

.controller('ProgressController', function($scope, ProgressDBFactory) {

    $scope.progressData = {};

    var progPromise = ProgressDBFactory.getAllProgressData();

    progPromise.then(function(res) {
        $scope.progressData = res;
        console.log($scope.progressData); // POINT A <= Here it prints all the results from the database.
    });

    console.log($scope.progressData); // POINT B <= here it just prints an empty object

})

在点A处,它正确打印数据库的结果。但在B点,它打印一个空对象。此外,在控制台中,点B在点A打印之前打印。这对我来说意味着B点是在承诺完成执行之前执行的。我说得对吗?我是javascript新手,这对我来说毫无意义。有人能澄清这一点并给出解决方案吗。请帮助

点B总是出现在点A之前,因为点A被包装在从异步调用承诺到DB的回调中。就执行顺序而言,代码没有问题。尽管您可能必须将范围分配包装在$apply中,因为您是在Angular上下文之外执行它的,据我所知,这是来自第三方库的回调

progPromise.then(function(res) {
    $scope.$apply(function() {
       $scope.progressData = res;
       console.log($scope.progressData); // POINT A <= Here it prints all the results from the database.
    })
});
有关$apply的更多信息:

函数{ progPromise.Then函数{ scp.progressData=res; console.logscp.progressData;//点A 函数{ progPromise.Then函数{ scp.progressData=res;
console.logscp.progressData;//谢谢您的回答,但它不起作用。$scope.apply中的日志消息不会打印到控制台。我假设getAllProgressData引用工厂中的getAllData函数。除此之外,我认为您的代码两次解析了承诺,工厂都返回了承诺但是,如果你在A点打印数据,它不是显示在视图html中吗?我制作了这个简单的JSFIDLE来表示,对于生成视图的值,你的代码应该已经在工作了。问题是我需要将从IndexedDb获取的数据输入到一个图表中,然后然后,该图表在绑定到HTML视图的控制器中设置为$scope变量。由于$scope.progressData在B点和B点之外不可用,因此我无法通过处理从数据库中获取的值来设置其他$scope变量。我恐怕我仍然看不清问题所在,因此您应该公开更多代码e正在尝试实现…progressData变量可用于整个$scope。如果处理来自数据库的最新值,则在回调中执行。我现在更新了小提琴以显示连续的轮询数据,但它不起作用,兄弟,相同的结果。您能告诉我一种等待承诺完成的方法吗?