Kolejność operacji JS Firebase [duplikat]

Aug 28 2020

Czy ktoś mógłby mi wyjaśnić, dlaczego poniższy kod najpierw wywołuje alert „F”, a następnie ALERTY „S” i „V”.

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

Odpowiedzi

1 DougStevenson Aug 28 2020 at 00:23

once()jest asynchroniczna i zwraca natychmiast, przed zakończeniem zapytania. Wywołanie zwrotne, które mu podasz, zostanie wykonane jakiś czas później.

Wszystkie interfejsy API Firebase są asynchroniczne, co jest bardzo częste w JavaScript. Powinieneś także wiedzieć, że once()również zwraca obietnicę, a ta obietnica jest lepszym sposobem obsługi wyników wywołań asynchronicznych. We współczesnym programowaniu w JavaScript bardzo ważne jest zrozumienie, jak działają obietnice.

Proponuję przeczytać na tym blogu, dlaczego interfejsy API Firebase są asynchroniczne .

1 Titulum Aug 28 2020 at 00:26

Jak widać w dokumentacji , oncejest to wywołanie asynchroniczne. Oznacza to, że kod będzie kontynuował zadania synchroniczne do momentu pobrania danych. Następnie zostanie wykonany kod zawarty w wywołaniu zwrotnym.

Aby alerty „S” i „V” pojawiały się jako pierwsze, musisz skorzystać z 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");
}

Więcej informacji o async/await