Angular(9)には、IDに基づいてFirestoreでドキュメントを検索しようとする次のメソッドがあります。ただし、ドキュメントがFirestoreに存在しない場合は、ユーザーにカスタムメッセージを送信したいと思います。このコードに要約されているように、エラーをキャッチする3つの異なる方法を試しました。
joinGame(name, gameID): void {
this.changeName(name);
if (this.nameValid(name)) {
sessionStorage.setItem('gameID', gameID);
this.ws.joinGame(gameID, name);
try {
const gameDoc = this.afs.doc('games/' + gameID);
const game = gameDoc.valueChanges();
game.pipe(catchError => of([])).subscribe(data => {
//@ts-ignore
this.localGame = data.game;
}, err => console.log(err));
} catch (err) {
console.log(err);
}
} else {
this.nameError = true;
}
}
1-トライキャッチ
2-サブスクライブ後にキャッチ
3- catchError(これが何であるかは実際にはわかりませんが、とにかく試してみようと思いました)。
とにかく、これらのどれも私が望んでいたものをconsole.logに記録したり、エラーを適切に処理したりするようには見えませんでした。何をログに記録しても、コンソールはデフォルトのエラーを表示しました。サブスクライブする前に、ユーザーにチェック付きの無効なIDを入力させないようにすることもできますが、これをより自動的に行うためのより良い解決策があるかどうか疑問に思っていました。ありがとうございました!
エラーをキャッチするのではなく、それを行うためのより良い方法があると思います。つまり、使用した後.doc('someId').get()
、エラーをスローすることなく、結果のドキュメントが存在するかどうかをすでに確認できるからです。だから私はあなたが持っているコードを次のように変更します:
joinGame(name, gameID): void {
this.changeName(name);
if (this.nameValid(name)) {
sessionStorage.setItem('gameID', gameID);
this.ws.joinGame(gameID, name);
try {
const gameDoc = this.afs.doc('games/' + gameID).get().then(docSnapshot => {
if(docSnapshot.exists){
const game = gameDoc.valueChanges();
game.subscribe(data => {
//@ts-ignore
this.localGame = data.game;
}
}else{
console.log("The document does not exist in the Firestore");
}
});
} catch (err) {
console.log(err);
}
} else {
this.nameError = true;
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加