Estoy tratando de enviar datos a la base de datos en tiempo real de Firebase y después de que los datos se envían (y se guardan), el navegador debería abrir otra página. He usado la función "ubicación.reemplazar ()" para abrir la página siguiente, sin embargo, agregar la línea ubicación.reemplazar hace que los datos no se guarden en la base de datos en tiempo real de Firebase.
Aquí está mi código
var updates = {}; updates['/users/' + document.getElementById('username').value] = data; firebase.database().ref().update(updates); console.log("Saved successfully") location.replace("nextpage.html");La función de update es asíncrona; llevará algún tiempo completarlo. Si desea esperar hasta que finalice la actualización, deberá usar la promesa que devuelve:
var updates = {}; updates['/users/' + document.getElementById('username').value] = data; firebase.database().ref().update(updates) .then(() => { console.log('Saved successfully'); location.replace('nextpage.html'); }); O con async / await :
async function someFunction () { var updates = {}; updates['/users/' + document.getElementById('username').value] = data; await firebase.database().ref().update(updates); console.log("Saved successfully") location.replace("nextpage.html"); }la actualización parece ser una función asíncrona, devolviendo una promesa. por lo que debe manejarlo adecuadamente. De lo contrario, la llamada a "ubicación" puede llegar antes de que finalice la actualización.
Cámbialo así:
firebase.database().ref().update(updates).then(() => { console.log("Saved successfully") location.replace("nextpage.html"); }).catch(error => {console.log('Error:', error)})Si no desea usar la promesa, proporcione un argumento adicional a la función de actualización que servirá como una función de devolución de llamada, es decir, se llamará cuando finalice la actualización:
firebase.database().ref().update(updates, function() { console.log("Saved successfully") location.replace("nextpage.html"); })