Coba Cloud Firestore: Lihat database yang skalabel dan fleksibel dari Firebase dan Google Cloud Platform. Pelajari Cloud Firestore lebih lanjut.

Mengaktifkan Kemampuan Offline di JavaScript

Aplikasi Firebase tetap berfungsi meskipun aplikasi Anda kehilangan koneksi jaringan untuk sementara. Kami menyediakan beberapa fitur bantuan untuk memonitor kehadiran dan melakukan sinkronisasi status lokal dengan status server, yang diperkenalkan dalam dokumen ini.

Mengelola Kehadiran

Pada aplikasi realtime, mendeteksi kapan klien membuat dan memutus koneksi sering kali bermanfaat. Misalnya, Anda mungkin ingin menandai pengguna sebagai 'offline' saat kliennya memutus koneksi.

Klien Firebase Database menyediakan primitif sederhana yang dapat Anda gunakan untuk menulis ke database saat klien terputus dari server Firebase Database. Update ini akan terjadi, terlepas dari apakah klien terputus secara rapi atau tidak, sehingga Anda dapat mengandalkannya untuk membersihkan data bahkan saat koneksi terputus atau klien mengalami error. Semua operasi tulis, termasuk menyetel, mengupdate, dan menghapus, dapat dilakukan setelah koneksi terputus.

Berikut adalah contoh sederhana penulisan data setelah koneksi terputus menggunakan primitif onDisconnect:

var presenceRef = firebase.database().ref("disconnectmessage");
// Write a string when this client loses connection
presenceRef.onDisconnect().set("I disconnected!");

Cara Kerja onDisconnect

Ketika Anda membuat operasi onDisconnect(), operasi tersebut berlangsung di server Firebase Realtime Database. Server akan memeriksa keamanan untuk memastikan bahwa pengguna dapat menjalankan peristiwa tulis yang diminta, dan memberi tahu aplikasi Anda jika peristiwa tersebut tidak valid. Selanjutnya, server akan memantau koneksinya. Jika sewaktu-waktu koneksi terputus atau ditutup secara aktif oleh klien Realtime Database, server akan memeriksa keamanan untuk kedua kalinya (untuk memastikan operasi tetap valid) dan kemudian memanggil peristiwa tersebut.

Aplikasi Anda dapat menggunakan callback pada operasi tulis untuk memastikan onDisconnect terpasang dengan benar:

presenceRef.onDisconnect().remove(function(err) {
  if (err) {
    console.error('could not establish onDisconnect event', err);
  }
});

Peristiwa onDisconnect juga dapat dibatalkan dengan memanggil .cancel():

var onDisconnectRef = presenceRef.onDisconnect();
onDisconnectRef.set('I disconnected');
// some time later when we change our minds
onDisconnectRef.cancel();

Mendeteksi Status Koneksi

Untuk banyak fitur yang terkait dengan kehadiran, aplikasi perlu mengetahui apakah statusnya online atau offline. Firebase Realtime Database menyediakan lokasi khusus di /.info/connected yang diupdate setiap kali status koneksi klien Firebase Realtime Database berubah. Berikut adalah contohnya:

var connectedRef = firebase.database().ref(".info/connected");
connectedRef.on("value", function(snap) {
  if (snap.val() === true) {
    alert("connected");
  } else {
    alert("not connected");
  }
});

/.info/connected adalah nilai boolean yang tidak disinkronkan antara klien Realtime Database karena nilainya bergantung pada status klien. Dengan kata lain, jika 1 klien membaca /.info/connected sebagai 'false', tidak ada jaminan bahwa klien lain juga akan membacanya sebagai 'false'.

Menangani Latensi

Stempel Waktu Server

Server Firebase Realtime Database memiliki mekanisme untuk menyisipkan stempel waktu yang dibuat di server sebagai data. Fitur ini, digabungkan dengan onDisconnect, memberikan cara mudah dan andal untuk mengetahui kapan koneksi klien Realtime Database terputus:

var userLastOnlineRef = firebase.database().ref("users/joe/lastOnline");
userLastOnlineRef.onDisconnect().set(firebase.database.ServerValue.TIMESTAMP);

Clock Skew

Meskipun firebase.database.ServerValue.TIMESTAMP jauh lebih akurat dan lebih cocok untuk sebagian besar operasi baca/tulis, terkadang ada baiknya memperkirakan clock skew klien yang terkait dengan server Firebase Realtime Database. Anda dapat menambahkan callback ke lokasi /.info/serverTimeOffset untuk mendapatkan nilai, dalam milidetik, yang ditambahkan oleh klien Firebase Realtime Database ke waktu lokal yang dilaporkan (periode waktu dalam milidetik) untuk memperkirakan waktu server. Perlu diperhatikan bahwa akurasi selisih ini dapat dipengaruhi oleh latensi jaringan, sehingga hanya bermanfaat untuk menemukan selisih waktu jam yang besar (> 1 detik).

var offsetRef = firebase.database().ref(".info/serverTimeOffset");
offsetRef.on("value", function(snap) {
  var offset = snap.val();
  var estimatedServerTimeMs = new Date().getTime() + offset;
});

Contoh Aplikasi Kehadiran

Dengan menggabungkan operasi pemutusan koneksi dengan pemantauan status koneksi dan stempel waktu server, Anda dapat membangun sistem kehadiran pengguna. Dalam sistem ini, setiap pengguna menyimpan data di lokasi database untuk menunjukkan apakah klien Realtime Database sedang online atau tidak. Klien akan menetapkan lokasi ini ke 'true' jika mereka online dan ke stempel waktu jika mereka memutuskan koneksi. Stempel waktu ini menunjukkan kapan terakhir kali pengguna tertentu online.

Perlu diperhatikan bahwa aplikasi Anda harus mengantrekan operasi pemutusan koneksi sebelum pengguna ditandai online, untuk menghindari keluaran yang tidak sesuai waktunya jika sewaktu-waktu koneksi jaringan klien terputus sebelum kedua perintah dapat dikirimkan ke server.

Berikut adalah contoh sederhana dari sistem kehadiran pengguna:

// since I can connect from multiple devices or browser tabs, we store each connection instance separately
// any time that connectionsRef's value is null (i.e. has no children) I am offline
var myConnectionsRef = firebase.database().ref('users/joe/connections');

// stores the timestamp of my last disconnect (the last time I was seen online)
var lastOnlineRef = firebase.database().ref('users/joe/lastOnline');

var connectedRef = firebase.database().ref('.info/connected');
connectedRef.on('value', function(snap) {
  if (snap.val() === true) {
    // We're connected (or reconnected)! Do anything here that should happen only if online (or on reconnect)
    var con = myConnectionsRef.push();

    // When I disconnect, remove this device
    con.onDisconnect().remove();

    // Add this device to my connections list
    // this value could contain info about the device or a timestamp too
    con.set(true);

    // When I disconnect, update the last time I was seen online
    lastOnlineRef.onDisconnect().set(firebase.database.ServerValue.TIMESTAMP);
  }
});

Kirim masukan tentang...

Firebase Realtime Database
Butuh bantuan? Kunjungi halaman dukungan kami.