Javascript 承诺使用PockDB和AngularJs ng重复阵列

Javascript 承诺使用PockDB和AngularJs ng重复阵列,javascript,arrays,angularjs,lodash,pouchdb,Javascript,Arrays,Angularjs,Lodash,Pouchdb,我正在将PockDB数据库中的allDocs()读入AngularJS变量: var db = pouchService.db; $scope.recordlist = db.allDocs({startkey: 'move_', endkey: 'move_\uffff', include_docs: true}); console.log($scope.recordlist); 我注意到它返回了一个承诺,当我尝试使用ng repeat读取数组(以及数组中对象的属性)时,它实际上无法访问结果

我正在将PockDB数据库中的allDocs()读入AngularJS变量:

var db = pouchService.db;
$scope.recordlist = db.allDocs({startkey: 'move_', endkey: 'move_\uffff', include_docs: true});
console.log($scope.recordlist);
我注意到它返回了一个承诺,当我尝试使用ng repeat读取数组(以及数组中对象的属性)时,它实际上无法访问结果,我猜是因为它们嵌套得很深

<div class="row msf-row" 
     ng-repeat="record in recordlist | filter: shouldShow" 
     ng-class="{ 'msf-cancelled': record.cancelled, 'msf-commented' : record.comment}">
       <div class="col-md-1">{{record.time}}</div>
</div>

{{record.time}
有没有办法把这个承诺变成一个简单的对象数组


我在应用程序中也加载了LoDash,我不知道它是否有用。

您所做的是访问承诺,而不是承诺结果。虽然
allDocs
确实返回了一个承诺,但它不是一个角度承诺,因此当
得到一个实际的角度承诺时,您还应该将该承诺包装在

var pouchPromise = db.allDocs({startkey: 'move_', endkey: 'move_\uffff', include_docs: true});
$q.when(pouchPromise).then(function(recordList){
    $scope.recordList = recordList;
    console.log($scope.recordlist);
});
我会仔细阅读承诺是如何起作用的

应注意的是,实际邮袋DB文件中概述了使用邮袋的方法:

具体而言:

使用离子/角度?您可以在$q.when()中包装数据库承诺。这将通知Angular在数据库承诺解决后更新UI


这将允许您在处理非角度承诺的异步性质时避免使用
$scope.$apply()

在承诺履行后分配数组(或在发生错误时显示错误):

更新:
正如Matt在评论中指出的,如果您没有使用angular Pocket wrapper,那么您需要将动作包装在
$scope.$apply()
中,以触发摘要循环,或者首先使用
$q.when()
将承诺转换为angular promise。我认为,将承诺转换为角度承诺也会处理日志错误,但您应该始终处理错误(向用户显示消息)。当然,您可以使用全局错误处理程序来执行此操作。

这不是我在angular中执行此操作的方式,因为PockDB不会直接转换为angular承诺。它提供与承诺/a+兼容的承诺,这远远超出了您在这个简单情况下的需要。我只会转换它,如果我想把它传递给一些角度函数,比如控制器的resolve属性。但在这种情况下,不需要。不,这是完全错误的,和承诺的能力无关。Angular的承诺直接进入了消化周期,而DB的承诺则不然。这意味着为了您的行
$scope.recordList=recordList
要工作,您需要包含一个
$scope.$apply()
@MattWay,我正在使用来处理这个问题,这可能就是freshfilicio的答案起作用的原因。因此,我认为你们都是对的。@MattWay我没有投任何反对票。你说得对,我更新了我的答案。
$q.when(db.allDocs({startkey: 'move_', endkey: 'move_\uffff', include_docs: true}))
  .then(function (recordlist) {
    $scope.recordList = recordList;
    console.log($scope.recordlist);
  })
  .catch(function (error) {
    console.error(error);
  });