Построение приложения с присутствием после документов firebase, есть ли сценарий, когда отключается при отключении приложения? Мы видим случаи, когда узел присутствия показывает, что приложение переходит в автономный режим, а затем обратно в сети в течение нескольких секунд, когда мы не теряем сетевое соединение.Firebase onDisconnect() стрельба несколько раз
Мы видим на нескольких встроенных устройствах, установленных в поле, где для присутствия установлено значение «ложь», а затем почти сразу же назад - «истина», и оно происходит на всех устройствах в течение нескольких секунд друг от друга. Из проведенного нами тестирования и онлайн-документов мы знаем, что, если мы потеряем подключение к Интернету на устройстве, он занимает примерно 60 секунд, прежде чем таймаут на сервере запускает метод onDisconnect().
С тех пор мы добавили код в метод присутствия, который позволяет устройству, если он видит, что узел присутствия установлен в false, пока приложение действительно работает, вернет его обратно в true. Иногда, когда это происходит, мы получаем одну запись обратно в true, и это конец, в других случаях это похоже на то, что сервер и клиент сражаются друг с другом, а узел сбрасывается до истины много раз в течение 50-200 миллисекунды. Мы отслеживаем это путем нажатия на другой узел в GUID устройства каждый раз, когда мы заставляем присутствие вернуться к истинному. Это происходит только во время работы модуля и после того, как оно первоначально устанавливает присутствие.
Вот метод, который мы вызываем из наших различных модулей, работающих на устройстве, чтобы мы могли контролировать состояние каждого из модулей в любой момент времени.
exports.online = function (program, currentProgram) {
var programPath = process.env.FIREBASE_DEVICES + process.env.GUID + '/status/' + program
var onlinePath = process.env.FIREBASE_DEVICES + process.env.GUID + '/statusOnlineTimes/' + program
var programRef = new firebase(programPath);
var statusRef = new firebase(process.env.FIREBASE_DEVICES + process.env.GUID + '/status/bootup');
var onlineRef = new firebase(onlinePath)
amOnline.on('value', function(snapshot) {
if (snapshot.val()) {
programRef.onDisconnect().set(false);
programRef.set(true);
programRef.on('value', function(snapshot){
if (snapshot.val() == false){
programRef.set(true);
console.log('[NOTICE] Resetting', program, 'module status back to True after Fireabase set to False')
var objectToPush = {
program: program,
time: new Date().toJSON()
}
onlineRef.push(objectToPush)
}
})
if (currentProgram != undefined) {
statusRef.onDisconnect().set('Offline')
statusRef.set(currentProgram)
}
}
});
вопрос мы там когда-нибудь экземпляр, где Firebase звонит метод, даже если он на самом деле не теряет свой статус в OnDisconnect()? У нас были случаи, когда мы увидели, что устройство переходит в автономный режим, а затем обратно через 60 секунд, прежде чем мы добавим код сброса. Код сброса состоял в том, чтобы бороться с еще одной проблемой, которая была у нас в поле, где, если питание было прервано на устройство, и он не сделал чистый выход, устройство может перезагрузиться и сбросить присутствие с помощью нового UID до истечения таймаута для предыдущего экземпляр уволился. Затем, как только тайм-аут будет запущен, устройство будет отображаться как офлайн, даже если оно действительно онлайн.