37
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Firestoreのリアルタイムリスナーの書き方

Last updated at Posted at 2020-06-11

FirestoreにはWebSocketを利用して、データの更新を各端末に送信するリアルタイムリスナーという仕組みがあります。
更新を確認するのにポーリングする必要がなく非常に強力な仕組みです。

CRUDの書き方は以下を参照してください。
FirestoreのCRUD操作の書き方まとめ

単一ドキュメントのリッスン

リアルタイムリスナーを使用たい場合は、ドキュメントのリファレンスでonSnapshotメソッドを使用します。

 db.doc('items/[documentId]')
   .onSnapshot(function(doc) {
      
       // ドキュメントが作成、変更、削除されるたびに出力される
       console.log(doc.data());
       
       // リスナーの停止
       unsubscribe();
   });

リスナーを停止する場合は、unsubscribeメソッドです。

複数ドキュメントのリッスン

複数ドキュメントの変更を検知したい場合も同様です。

 db.collection('items')
   .where('price', '>', 100)
   .onSnapshot(function(snapshot) {
       let items = [];
       snapshot.forEach(function(doc) {
           items.push(doc.data());
       });
       console.log(items[0].price);
   });

変更内容によって処理を分岐する

ドキュメントの更新内容によって処理を分岐したい場合は、スナップショットからdocChangesメソッドを呼び出します。

db.collection('items')
  .where('price', '>', 100)
  .onSnapshot(function(snapshot) {
    snapshot.docChanges().forEach(function(change) {
        // 追加時
        if (change.type === 'added') {
            console.log(change.doc.data().name);
        }
        // 更新時
        if (change.type === 'modified') {
            console.log(change.doc.data().name);
        }
        // 削除時
        if (change.type === 'removed') {
            console.log(change.doc.data().name);
        }
    });
});
37
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?