Ordem de operações JS Firebase [duplicado]

Aug 28 2020

Alguém pode me explicar porque o código abaixo executa primeiro o alerta "F", depois os ALERTAS "S 'e" V'.

var status = ' ';
  database.ref('housekeeping/ongoing').once('value', function(snapshot){
    alert(status + "S");
    status = snapshot.val();
    alert(status + "V");
  });
  alert(status + "F");

Respostas

1 DougStevenson Aug 28 2020 at 00:23

once()é assíncrono e retorna imediatamente, antes que a consulta seja concluída. O retorno de chamada fornecido a ele será executado algum tempo depois.

Todas as APIs do Firebase são assíncronas e isso é muito comum em JavaScript. Você também deve saber que once()também retorna uma promessa, e essa promessa é a melhor maneira de lidar com os resultados de chamadas assíncronas. É muito importante na programação JavaScript moderna entender como funcionam as promessas.

Sugiro ler este blog sobre por que as APIs do Firebase são assíncronas .

1 Titulum Aug 28 2020 at 00:26

Como você pode ver na documentação , onceé uma chamada assíncrona. Isso significa que o código continuará com tarefas síncronas até que os dados sejam recuperados. Em seguida, o código dentro de seu retorno de chamada será executado.

Para fazer com que os alertas 'S' e 'V' apareçam primeiro, você precisará fazer uso de async/await:

async function getDatabaseData() {
  const snapshot = await database.ref('housekeeping/ongoing').once('value');
  alert(status + "S");
  status = snapshot.val();
  alert(status + "V");
  alert(status + "F");
}

Mais informações sobre async/await