Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple Firestore queries, single promise / callback

I understand that Firestore doesn’t support logical OR for queries. My idea is to create multiple queries and merge the results at the client. I am developing a news app and I am trying to fetch all articles that contain my users’ interests tags (ex. technology, music etc) An average user has 20 tags so I will be making 20 different requests.

Does anyone has experience with chaining multiple requests and returning a unique promise when all results arrive.?

I am using the js sdk

My data structure:

articles (collection)

-article (document)
--id: 10
--time: 1502144665
--title: "test title"
--text: "test text"
--tags(obj) 
---technology: 1502144665,
---politics: 1502144665,
---sports: 1502144665

So I will need to create multiple db requests like the following.

user.tags = ["technology","politics","sports","architecture","business"];

for (var i = 0; i < user.tags.length; i++) {
  db.collection('articles').where(user.tags[i], '>', 0).orderBy(user.tags[i]))
    .get()
    .then(() => {
        // ... push to article array
  });)
}

I am trying to figure out how to create a promise / callback when every request finishes.

like image 376
Nickolas Damofli Avatar asked Nov 28 '22 22:11

Nickolas Damofli


1 Answers

You can save each of the database access Promises in an array, then use Promise.all() to get a Promise that resolves when each of the database accesses is complete. (This code is not tested, it may contain some syntax errors, but it demonstrates the idea.)

user.tags = ["technology","politics","sports","architecture","business"];

var dbPromises = [];
for (var i = 0; i < user.tags.length; i++) {
  dbPromises.push(
      db.collection('articles')
        .where(user.tags[i], '>', 0)
        .orderBy(user.tags[i])
        .get()
  );
}

Promise.all(dbPromises)
    .then(() => {
        // ... push to article array
};
like image 152
Scott Kronheim Avatar answered Dec 04 '22 13:12

Scott Kronheim