我正试图从pouchDB获取数据,我为它写了工厂。
fac.factory('dbFactory',function(){
var db = new PouchDB('dbname');
return {
post: function(data){
db.post({
title: data
}, function (err, response) {
if(err){console.log(err)};
console.log(response)
return response
});
},
get: function(date){
db.get(date, function(err, doc) {
if(err){console.log(err)};
console.log(doc);
return doc
});
},
当我这样做时
$scope.drivers = dbFactory.get('2EC8999B-FC24-4AF6-A171-A43C8414C3D1');
我在JS控制台中获取了数据,但在模板中变量{{drivers}}是空的。
Object_id: "2EC8999B-FC24-4AF6-A171-A43C8414C3D1"
_rev: "1-5779e6518d996fddf8e38f2c436db506"
drivers: Array[3] 0: "Martin" 1: "Vlada" 2: "Jan" length: 3
__proto__: Array[0]
__proto__: Object
编辑:现在我意识到我"看到"变量仅在工厂中,但不在控制器中。
答案 0 :(得分:1)
在JavaScript中,一旦你异步,你需要继续编写异步代码。查看您的get
功能:
get: function(date){
db.get(date, function(err, doc) {
return doc
});
},
return doc
没有从get
返回,它从db.get
返回。您的顶级函数只是一个无效调用。但是,即使您从异步回调返回,您仍然会返回void,因为JavaScript会同步评估返回值 。我不熟悉PouchDB但是扫描文档,看起来它只支持Continuation Passing Style。这意味着获得结果的方法是提供回调或创建围绕PouchDB方法的承诺。以下是两种方法:
<强>回调强>
get: function(date, callback){
db.get(date, function(err, doc) {
// do whatever logic needs to be done beforehand, then...
if("function" === typeof callback){
callback.call(null, err, doc);
}
});
},
// usage
dbFactory.get('2EC8999B-FC24-4AF6-A171-A43C8414C3D1', function(err, doc){
$scope.drivers = doc;
});
<强>无极强>
// need to include $q dependency in your factory..
get: function(date){
var deferred = $q.defer();
db.get(date, function(err, doc) {
if(err){
deferred.reject(err);
} else {
deferred.resolve(doc);
}
});
return deferred.promise;
},
// usage
dbFactory.get('2EC8999B-FC24-4AF6-A171-A43C8414C3D1').then(
function onSuccess(doc){
$scope.drivers = doc;
},
function onError(err){
$scope.drivers = null;
});
就个人而言,我更喜欢承诺风格。在Angular 1.2之前,您可以将UI直接绑定到promise,它将自动解析。在1.2中,您必须选择加入此功能。我相信选择加入将在1.3中删除。我更喜欢promise样式的原因是因为你编写的服务和工厂与Angular核心库保持相当一致。