如何在AngularJS上使用service函数检查一个包db文档是否存在

how to check if a PouchDB doc exist or not using an service function on AngularJS?

本文关键字:一个 db 存在 是否 文档 检查 AngularJS 函数 service      更新时间:2023-09-26

我正在尝试做一个服务函数来检查一个特定的文档是否存在,我在控制器中有这个

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