Подтвердить что ты не робот

Как обрабатывать пустые массивы в Firebase?

Скажите person может иметь несколько cars, а car может иметь несколько accidents. Таким образом, мы могли бы:

# Person with no cars
person:
  name: "Misha"
  cars: []

# Person with free-accident car
person:
  name "Arlen"
  cars:
    0:
      name: "Toyota"
      accidents: []

Firebase хранит этих людей как:

person:
  name: "Misha"

и

person:
  name "Arlen"
  cars:
    0:
      name: "Toyota"

Итак, в JavaScript я должен сделать следующее, чтобы восстановить пустые массивы: (CoffeeScript)

if person.cars?
  for car in person.cars
    car.accidents = [] unless car.accidents?
else
  person.cars = []

Есть ли лучший способ обработки пустых массивов в Firebase без написания этого ненужного кода JavaScript?

4b9b3361

Ответ 1

Я думаю, что, если я понимаю основной вопрос, короткий ответ заключается в том, что нет способа заставить пустой массив в Firebase. Однако есть некоторые парадигмы, которые могут работать лучше, чем то, что у вас есть.

Имейте в виду, что Firebase - это среда реального времени. Количество автомобилей и несчастных случаев может (и будет) изменяться в любое время. Лучше всего рассматривать все, поскольку новые данные поступают в реальном времени и избегают даже думать о существовании или не существует.

// fetch all the people in real-time
rootRef.child('people').on('child_added', function(personSnapshot) {

   // monitor their cars
   personSnapshot.ref().child('cars', 'child_added', function(carSnapshot) {

       // monitor accidents
       carSnapshot.ref().child('accidents', 'child_added', function(accidentSnapshot) {
           // here is where you invoke your code related to accidents
       });
   });
});

Обратите внимание, что нет необходимости в логике типа if exists/unless. Обратите внимание, что вы, вероятно, также хотите отслеживать child_removed на cars и people и вызывать ref.off(), чтобы прекратить прослушивание определенных детей.

Если по какой-то причине вы хотите придерживаться статической модели, то forEach станет вашим другом:

// fetch all the people as one object, asynchronously
// this won't work well with many thousands of records
rootRef.child('people').once('value', function(everyoneSnap) {

   // get each user (this is synchronous!)
   everyoneSnap.forEach(function(personSnap) {

        // get all cars (this is asynchronous)
        personSnap.ref().child('cars').once('value', function(allCars) {

           // iterate cars (this is synchronous)
           allCars.forEach(function(carSnap) { /* and so on */ });

        });

   });   
});

Обратите внимание, что даже с forEach нет необходимости в логике "существует или не существует".

Ответ 2

Обычно я использую функцию DataSnapshot numChildren(), чтобы увидеть, не пусто ли она, например this

var fire = new Firebase("https://example.firebaseio.com/");
fire.once('value', function(data){if (data.numChildren() > 0){ /*Do something*/ });