0
votes

Comment puis-je faire les promesses de s'arrêter après avoir obtenu des résultats x en Fireestore

J'ai ce code qui vérifie si mes identifiants d'UserContacts existent dans une autre collection et que je retourne tous les matchs.

async function fetchCommonNumbers() {
    var commonNumbers = [];

    let contactsReference = admin.firestore().collection("user_contacts").doc("iNaYVsDCg3PWsDu67h75xZ9v2vh1").collection("contacts");
    const dbContactReference = admin.firestore().collection('db_contacts_meta');

    userContacts = await contactsReference.get();
    userContacts = userContacts.docs;

    await Promise.all(
        userContacts.map(userContact => {
            const DocumentID = userContact.ref.id;
                //Check if Document exists
                return dbContactReference.doc(DocumentID).get().then(dbContact => {
                    if (dbContact.exists) {
                        console.log(DocumentID);
                        commonNumbers.push(dbContact.data());
                    }
                });
        }));

    return Promise.resolve(commonNumbers);

}


0 commentaires

3 Réponses :


0
votes

Actuellement, il n'y a pas de mise en œuvre de promesses annulables (plus d'informations peut être trouvée ici Entrez la description de la liaison ici ),

Si vous le souhaitez, vous pouvez définir votre propre "promesse annulable" qui enveloppe une promesse normale.


3 commentaires

Merci pour votre réponse! Recommandez-vous NPMJS.com/Package/Cancelable-Pomise ?


Ouais c'est un bon forfait. Veuillez noter la question comme répondu.


Il n'a pas fonctionné :( Comme je ne peux pas annuler la promesse de la promesse



0
votes

Réduisez le temps de traitement sans «arrêter» des promesses

Vous ne pouvez pas vraiment faire les promesses arrêter em>. Mais puisque vous cherchez à réduire le nombre d'appels de base de données forts>, ce que vous pouvez faire est de sélectivement em> résoudre vos promesses forts>. P>.

Par exemple, vous pouvez inclure une instruction conditionnelle dans votre fonction code> (code>. Comme ça p>

  • si commonnumbers.length puis me renvoie une promesse contenant l'appel de la base de données li>
  • ailleurs, résolvez simplement une valeur aléatoire (comme false code> dans mon exemple) li> ul>

    Vos promesses seront toujours là, mais vous aurez limité le nombre d'appels de DB au besoin fort>. Il ressemblera à quelque chose comme ça p>

    p>

    const arr = [1, 2, 3, 4, 5, 6];
    const buffer = [];
    const maxLenBuffer = 3;
    
    const p = Promise.all(
      arr.map(n => {
          if (buffer.length < maxLenBuffer) {
              buffer.push(n);
              return Promise.resolve(n);
          } else {
              // There's still a promise to be resolved, but it's not a HTTP call
              // This gives you the gain of performance you're looking for
              return Promise.resolve(false);
          }
      })
    );
    
    p.then(() => console.log(buffer));


3 commentaires

Je crains que cela ne fonctionnait pas. Je pense que parce que la promesse.Resolve est instantanée et retourne une promesse en attente, ce qui ne suffit pas de temps pour le si (tampon.length


C'est vrai, merci pour le commentaire. J'ai ajouté une édition pour inclure votre note


Merci pour votre édition. De plus, dans mon exemple, je vérifie si le document existe avant de l'ajouter le tableau (dans votre mémoire tampon). J'ai donc besoin de la promesse de terminer avant que je sache si cela devrait être ajouté ou non



0
votes

Au lieu de briser la promesse entre les deux, je vous suggère d'utiliser le LIMIT Méthode do Firestore.

Vous pouvez interroger uniquement pour X Nombre d'enregistrements et ce x peut être corrigé ou peut provenir de l'utilisateur. Quelque chose comme: xxx


1 commentaires

La collection User_Contacts n'a que environ 500 documents, ce qui ne provoque aucun problème, le temps d'exécution est millisecondes. C'est la collection DB_Contacts_META qui aura plus tard des millions de documents. Je n'exègre que un chèque de document sur db_contacts_méta avec un chemin de saisie, donc je ne peux pas utiliser la limite. Mais mon problème est que je veux arrêter de vérifier l'existence de documents après avoir trouvé.