如何使用 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