A continuación, se muestra la documentación de Firestore como ejemplo de cómo adjuntar un oyente de actualizaciones en tiempo real para los datos de Firestore. Mi pregunta es, ¿por qué necesitaría asignar al oyente a una variable? En otras palabras, entiendo que uno puede asignar una promesa a una variable para que pueda ser return ed o await ed o .push ed a una matriz, pero nada de eso parece aplicarse a un oyente en tiempo real, a menos que me esté perdiendo el punto? ... ¿por qué asignar .onSnapshot a var?

var doc = db.collection('cities').doc('SF');

var observer = doc.onSnapshot(docSnapshot => {
  console.log(`Received doc snapshot: ${docSnapshot}`);
  // ...
}, err => {
  console.log(`Encountered error: ${err}`);
});
0
Ronnie Royston 16 oct. 2018 a las 22:18

2 respuestas

La mejor respuesta

Esto le permite eliminar el observador más tarde. En su caso, cancelaría la suscripción llamando a observer(), por lo que generalmente lo llamamos unsubscribe como en la sección sobre separar un oyente.

2
Frank van Puffelen 16 oct. 2018 a las 19:28

firebase.firestore.CollectionReference o firebase.firestore.DocumentReference es la variable requerida para llamar al método .onSnapshot. Una sola función muteListener genérica puede recibir cualquier referencia para silenciar / cancelar suscripción. Suponiendo que está escuchando un documento de dirección:

var shipToLocationDocument = null;

function muteListener(ref){
    return ref.onSnapshot(() => {});
}

shipToLocationDocumentListener = function () {
    return shipToLocationDocumentRef.onSnapshot(function (shipToLocationDocumentSnapshot) {
        //callback function to fire
        shipToLocationDocumentStateHandler(shipToLocationDocumentSnapshot);
    }, function(error) {
        console.log("shipToLocationDocumentSnapshot error " + error.message);
    });
};
//call the function
shipToLocationDocumentListener();

//callback function
function shipToLocationDocumentStateHandler(shipToLocationDocumentSnapshot){
    if(shipToLocationDocumentSnapshot.exists){
        shipToLocationDocument = shipToLocationDocumentSnapshot;
        displayShipToLocation(shoppingCartDocument.data().shipTo); //actually we have all the info here already
    } else {
        shipToLocationDocument == null;
    }
}
0
Ronnie Royston 23 oct. 2018 a las 00:39