如何使用 AngularJS 上的服务功能检查 PouchDB 文档是否存在?
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 的承诺),因为我总是在我的控制器中得到 undefined。
我也试过:
myService.exist = function(){
myDB.get('appConfig').then( function() {
return true;
}).catch(function() {
return false
});
};
我怎样才能正确得到这个响应?
您遇到的问题是由于 pouchDB 的 get
方法是 return 一个承诺,因此您不能让函数 return 从回调函数。
为了完成这个,你需要让你的函数return promise。
myService.exist = function(){
return myDB.get('config');
};
这将确保您可以调用函数并对结果应用 .then
函数。但是,这意味着您的函数将以与 get
函数相同的方式被解析或拒绝,因此您需要将调用函数更改为:
myService.exist().then(function () {
// doc Exists
}).catch(function () {
// doc does NOT Exist
});
如果您希望使用 boolean
而不是来自 pouch 的文档结果来解决您的承诺,您将需要定义一个新的承诺,以及 return 该承诺。我通常使用 Q 之类的库来执行此操作,但根据您的支持要求,您可以使用本机 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
}
});
这将确保您无论如何都可以解决承诺,因为您只关心文档是否存在,而不希望将丢失的文档视为错误。
如果您的函数依赖于一个承诺,您将无法让您的函数 return 成为一个布尔值,因为需要解析该承诺才能得到您的答案,而这需要时间。当你的函数完成时(调用 get
函数后,你还没有 return 任何东西(因为你在回调函数中有你的 returns 稍后被调用。所以你的函数 return未定义。
承诺一开始是痛苦的,但一旦你完全理解它们就会成为一个非常有用的工具。
https://developers.google.com/web/fundamentals/getting-started/primers/promises
我在Vue中使用这个,你可以试试下面的异步函数
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
。
我正在尝试执行一个服务功能来检查特定文档是否存在,我的控制器中有这个
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 的承诺),因为我总是在我的控制器中得到 undefined。
我也试过:
myService.exist = function(){
myDB.get('appConfig').then( function() {
return true;
}).catch(function() {
return false
});
};
我怎样才能正确得到这个响应?
您遇到的问题是由于 pouchDB 的 get
方法是 return 一个承诺,因此您不能让函数 return 从回调函数。
为了完成这个,你需要让你的函数return promise。
myService.exist = function(){
return myDB.get('config');
};
这将确保您可以调用函数并对结果应用 .then
函数。但是,这意味着您的函数将以与 get
函数相同的方式被解析或拒绝,因此您需要将调用函数更改为:
myService.exist().then(function () {
// doc Exists
}).catch(function () {
// doc does NOT Exist
});
如果您希望使用 boolean
而不是来自 pouch 的文档结果来解决您的承诺,您将需要定义一个新的承诺,以及 return 该承诺。我通常使用 Q 之类的库来执行此操作,但根据您的支持要求,您可以使用本机 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
}
});
这将确保您无论如何都可以解决承诺,因为您只关心文档是否存在,而不希望将丢失的文档视为错误。
如果您的函数依赖于一个承诺,您将无法让您的函数 return 成为一个布尔值,因为需要解析该承诺才能得到您的答案,而这需要时间。当你的函数完成时(调用 get
函数后,你还没有 return 任何东西(因为你在回调函数中有你的 returns 稍后被调用。所以你的函数 return未定义。
承诺一开始是痛苦的,但一旦你完全理解它们就会成为一个非常有用的工具。
https://developers.google.com/web/fundamentals/getting-started/primers/promises
我在Vue中使用这个,你可以试试下面的异步函数
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
。