2017-08-07 22 views
0

Ich versuche einen Weg zu finden, alle Objekte aus einer großen Datensammlung in Firebase Database zu iterieren.Paginiere ich durch eine riesige Firebase-Sammlung richtig?

Mein bester Versuch folgt, aber ich fand es seltsam, aus mehreren Gründen:

  1. startAt() Werte sind immer inklusive. Nach dem Holen von 100 Elementen musste ich meinen letzten abgerufenen Schlüssel als Argument für startAt verwenden, was dazu führt, dass das letzte Element wieder abgerufen wird.
  2. Die forEach Methode erlaubt keinen Rückruf mit einer Indexzählung, wie Sie denken würden es würde auf Basis von JS Standards, damit ich einen manuellen Index erstellen hatte - nicht sicher, dass es in jedem Fall arbeiten, wie ich bin nicht sicher, ob forEach funktioniert perfekt synchron

Hier ist mein Code, unter der Annahme, meine Sammlung befindet sich unter users.

const mapAllTripsPaginated = function (database, childSnapshotCallback, start = '', limit = 100, totalNb = 0) { 
    return database.ref('/users').orderByKey().startAt(start).limitToFirst(limit).once('value').then((snapshot) => { 
    let childrenPromises = [] 
    let lastChildKey = null 
    let idx = 0 
    snapshot.forEach((childSnapshot) => { 
     lastChildKey = childSnapshot.key 
     if (start !== '' && idx === 0) { 
     // console.log(`Skipping ${childSnapshot.key} as 1st element of page`) 
     } else { 
     childrenPromises.push(childSnapshotCallback(childSnapshot)) 
     } 
     idx = idx + 1 
    }) 
    return Promise.all(childrenPromises) 
    .then((result) => { 
     let newTotal = totalNb + result.length 
     if (snapshot.numChildren() === limit) { 
     console.log(`Paginating from ${lastChildKey}`) 
     return mapAllTripsPaginated(database, childSnapshotCallback, start = lastChildKey, limit = limit, totalNb = newTotal) 
     } else { 
     // Done paginating 
     return newTotal 
     } 
    }) 
    }) 
} 

Irgendeine Idee, wie ich diese Methode eleganter machen könnte?

Antwort

1
  1. Firebase-Abfragen enthalten sowohl Start- als auch Endbedingungen. In der Tat müssen Sie den überlappenden Artikel auf dem Client deduplizieren.

  2. Firebase Snapshot.forEach() ist ein synchroner Vorgang.

würde ich normalerweise basierend auf Deduplizierung bereits den Schlüssel des Elements mit. Das wird auch die Notwendigkeit für den idx Zähler entfernen.

snapshot.forEach((childSnapshot) => { 
    if (lastChildKey !== childSnapshot.key) { 
    childrenPromises.push(childSnapshotCallback(childSnapshot)) 
    } 
    lastChildKey = childSnapshot.key 
}) 
Verwandte Themen