Kolejność operacji JS Firebase [duplikat]
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
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 .
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