2016-10-05 5 views
0

、私は私のコントローラでこれを持ってAngularJSのサービス機能を使用してPouchDBのドキュメントが存在するかどうかを確認する方法は?私は、特定のドキュメントが存在するかどうかをチェックするサービス機能をやろうとしている

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 
     }); 
    }; 

私が正しく、この応答を取得できますか?

答えて

1

pouchDBのgetメソッドが約束を返しているため、関数がコールバック関数の内部から値を返すことはできません。

これを達成するために、あなたの関数が約束を返却する必要があります。

myService.exist = function(){ 
    return myDB.get('config'); 
}; 

これは、関数を呼び出し、その結果に.then機能を適用することができることを保証します。しかし、これはあなたの関数が解決またはget機能と同じように拒否されることを意味しますので、あなたのような何かにあなたの呼び出し元の関数を変更する必要があります:あなたはあなたの約束をして解決したい場合は

myService.exist().then(function() { 
    // doc Exists 
}).catch(function() { 
    // doc does NOT Exist 
}); 

booleanの文書の代わりに、新しい約束を定義し、その約束を返す必要があります。私は通常これを行うには、このような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 
    } 
}); 

これは、あなたが唯一の文書が存在していることを気にし、あなたがエラーとして不足している文書を処理するためにしたくないので、約束はどんな解決しないことができていることを確認します。

その約束は、あなたの答えを得るために解決する必要がありますので、あなたは、あなたの関数が約束に依存している場合、あなたの関数はブール値を返す必要がありすることはできませんが、これは時間がかかります。あなたの関数が完了したら(get関数を呼び出した直後に、コールバック関数で後で呼ばれることになるので、何も返されていません)。あなたは完全にそれを理解すれば非常に有用なツールです。

https://developers.google.com/web/fundamentals/getting-started/primers/promises

0

私はVueの中でこれを使用するには、

myService.exist = async function(){ 
    await myDB.get('config') 
     .then(function(){ return true;}) 
     .catch(function() { return false; }) 
}; 
0

として非同期機能で次のことを試すことができます新しいES7標準に従って、あなたのmyService。存在する場合は、このように見えます。

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を書くことを忘れないでください。

関連する問題