如何在AngularJS上使用service函数检查一个包db文档是否存在
how to check if a PouchDB doc exist or not using an service function on AngularJS?
我正在尝试做一个服务函数来检查一个特定的文档是否存在,我在控制器中有这个
if (myService.exist()){
// doc Exists
} else {
// doc does NOT Exist
}
myService
具有以下功能:
myService.exist = function(){
myDB.get('config', function(error, response){
if (error){
return false;
} else {
return true;
}
});
};
但是我错过了一些东西(可能是关于PouchDB承诺),因为我总是在我的控制器中得到未定义。
我也试过:
myService.exist = function(){
myDB.get('appConfig').then( function() {
return true;
}).catch(function() {
return false
});
};
我怎样才能正确地得到这个响应?
您遇到的问题是由于pouchDB的get
方法返回一个承诺,所以您不能让函数从回调函数内部返回一个值。
为了完成这一点,你需要让你的函数返回承诺。
myService.exist = function(){
return myDB.get('config');
};
这将确保您可以调用该函数并对结果应用.then
函数。但是,这意味着您的函数将以与get
函数相同的方式被解析或拒绝,因此您需要将调用函数更改为如下内容:
myService.exist().then(function () {
// doc Exists
}).catch(function () {
// doc does NOT Exist
});
如果你想用boolean
来解析你的promise,而不是从pouch返回的文档结果,你需要定义一个新的promise,并返回那个promise。我通常使用Q之类的库来完成此操作,但根据您的支持需求,您可以使用Native Javascript库,它看起来像:
myService.exist = function(){
return myDB.get('config').then(function () {
return Promise.resolve(true);
}).catch(function () {
return Promise.resolve(false);
});
};
然后你的调用函数看起来像这样:
myService.exist().then(function (res) {
if (res) {
// doc Exists
} else {
// doc does NOT Exist
}
});
这将确保无论如何都可以解决承诺,因为您只关心文档是否存在,并且不希望将丢失的文档视为错误。
如果你的函数依赖于一个promise,你将不能让你的函数返回一个布尔值,因为这个promise需要被解析才能得到你的答案,这需要时间。当你的函数完成时(在调用get
函数之后,你没有返回任何东西),因为你在回调函数中有返回值要稍后调用。所以你的函数返回undefined
承诺一开始是痛苦的,但一旦你完全理解它,它就会成为一个非常有用的工具。
https://developers.google.com/web/fundamentals/getting-started/primers/promises我在Vue中使用这个,您可以尝试以下async函数
myService.exist = async function(){
await myDB.get('config')
.then(function(){ return true;})
.catch(function() { return false; })
};
根据新的ES7
标准,您的myService。Exist可以是这样的
myService.exist = async (id) => myDB.get(id);
调用此服务时,使用await。
try{
await myService.exist('id');
//reaching here means it exists. write next part of your code here
}catch(err){
//means doc doesn't exist
}
不要忘记在包含控制器逻辑的函数中写入async
。
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- Mongo DB,Node Express,从MongoDB返回的输出中提取一个元素
- 在Dynamo DB中用JavaScript向映射添加一个新的键值
- 如何使用YDN-db在另一个Html页面中加载数据库上下文
- AngularJS过滤器根据迭代中的值显示DB中的另一个值
- 如何使用YDN-DB获取keypath之后的下一个元素
- AOP对DB异常执行一个通用的操作
- 用asp或jquery从MS access DB创建一个html表
- 如何在AngularJS上使用service函数检查一个包db文档是否存在
- 我如何使for循环等待db承诺完成之前,它继续下一个迭代
- PHP或javascript文本文件分号db使用一个记录显示另一个悬停
- 日期()javascript字符串插入到DB显示在一个漂亮的方式
- 一个onclick事件打开框和框上提交它链接到PHP函数设置一些值到db
- 将数据从db推入数组后调用另一个javascript函数
- 正在导出mongodb'db'到另一个node.js模块
- 将db值插入到一个.js文件laravel中
- 通过一个查询和条件重新思考db多次更新
- Rails在将记录添加到单独的DB时更新另一个DB计数器字段
- 如何得到一个书签弹出一个表单,提交URL和标题的DB加上评论
- 将检索到的数据从索引DB存储到一个变量