Firebase.off() Recursively for All Listeners

หากท่านเคยใช้ firebase ท่านก็มักจะคุ้นชินกับการใช้ method ref.on('..', callback); ของ firebase ซึ่งเป็นวิธีการหลักในการอ่านค่าจาก database ของ firebase ซึ่งอาศัยวิธีการสร้าง listener นั่นเอง

มันมักจะมีเหตุการณ์เสมอที่เราต้องการจะ "ปิด" listener เหล่านี้ ซึ่ง firebase มีเครื่องมือสำหรับสิ่งนี้ก็คือการเรียก ref.off() สำหรับการปิดทุก ๆ listener ทีอยู่บน ref นี้

ปัญหาก็เกิดขึ้นเมื่อ firebase ไม่มี method สำหรับ "ปิดทุก ๆ listener" นั่นก็คือเราไม่สามารถ เรียก rootRef.offRecursively() อะไรลักษณะนี้ได้

ในทีนี้ผู้เขียนต้องการใช้ฟังก์ชันดังกล่าวอย่างมาก จึงเสนอวิธีการแก้ปัญหาดังกล่าวด้วยการเขียน wrapper function ขึ้นมาดังนี้

ไฟล์: firebaseWrapper.js

let allRefs = [];

// all listener must be wrapped with this function
// for properly allOff function
export function wrap (ref) {  
  allRefs.push(ref);
  console.log('allRefs:', allRefs);
  return ref;
};

export function allOff () {  
  allRefs.forEach((ref) => ref.off());
  allRefs = [];
};

ดังนั้นเมื่อใดก็ต้องที่เราต้องการ ใช้ method พวกที่จะสร้าง listener เช่น .on('...', callback) เราจะต้อง wrap มันด้วย wrapper function ที่เราเพิ่งเขียนขึ้นมาดังนี้

import {wrap, allOff} from './firebaseWrapper';  
import Firebase from 'firebase';

const fireRef = new Firebase('....');

wrap(fireRef).onAuth(....);

const userRef = fireRef.child('users');

wrap(userRef).on('value', callback);

แต่ละครั้งที่เราเรียก wrap มันจะจำว่า มี ref ตัวไหนบ้างที่เราเรียกใช้ไปแล้ว ซึ่งจะทำให้ allOff() สามารถเรียก off() ได้ครบทุกตัวที่เกี่ยวข้อง

Konpat Preechakul

Read more posts by this author.