2013-08-20 2 views
0

В веб-приложение, у меня есть это:Как определить, является ли событие child_added локальным?

function onChildAdded(snapshot) { 
    // ... 
} 
someFirebaseLocation.on('child_added', onChildAdded); 

Я ищу на 100% надежный способ обнаружить ли немедленно child_added событие, так что я могу справиться два случая правильно: когда после толчка () функция вызывается немедленно (sync) vs, когда функция вызывается async.

Установка флага перед вызовом push() ненадежна. Я думаю. (Потенциальное состояние гонки, когда происходит асинхронное событие, и флаг может не сбрасываться при возникновении ошибки).

Другим вариантом было бы

var pushed = push(...); 

, а затем в child_added

if (snap.name() === pushed) 

, но входящее сообщение может иметь такую ​​же .name(), таким образом, не может быть столкновения. Вероятность столкновения спорна, но я бы предпочел простой и водонепроницаемый способ получить информацию.

Было бы замечательно, если бы я мог это сделать:

function onChildAdded(snapshot, prevChildName, isImmediateEvent) { 
    if (isImmediateEvent) { 
    // Handle as sync event. 
    } else { 
    // Handle as async event. 
    } 
} 
someFirebaseLocation.on('child_added', onChildAdded); 

или это

function onChildAdded(snapshot, prevChildName) { 
    if (snapshot.isFromImmediateEvent) { 
    // Handle as sync event. 
    } else { 
    // Handle as async event. 
    } 
} 
someFirebaseLocation.on('child_added', onChildAdded); 

Есть ли какой-либо другой надежный вариант? В противном случае я попрошу парней Firebase, могут ли они вообще передать bool «isImmediateEvent» в обратный вызов (после моментального снимка, prevChildName).

Tobi

+0

Tobi: Надеюсь, еще не поздно спросить вас, как вы, наконец, справились с этим. –

+0

Привет Тоби: В моем случае я переупорядочиваю элементы в массиве с использованием приоритетов. Одно перемещение локального элемента может производить различное количество событий child_moved и child_changed. Первый огонь в пределах 20 мс второй между 200 мс и 1000 мс. Вкратце я получил переменное количество событий и широкий диапазон откликов. Как вы справились с этим. Вы не нашли решения? –

+0

Как правило, изменение приоритета на одном элементе, поэтому его изменение позиции должно производить только одно дочернее событие и одно событие child_changed. И примечания здесь должны быть применимы. –

ответ

2

Вы разобрали два варианта на данный момент и ни один должен надежно работать (см примечания ниже). Мы могли бы добавить в будущем функции, чтобы сделать это проще, но на данный момент ничего конкретного не планируется.

Пара отмечает:

  1. Установка флага должно работать нормально. События async не будут происходить до тех пор, пока ваш синхронный код не завершится. Вы можете избежать ошибки, используя блок try/finally для ее сброса.
  2. Идентификаторы push() предназначены для универсальной уникальности, поэтому вам действительно не стоит беспокоиться о конфликтах.
Смежные вопросы