È importante gestire il ciclo di vita di una funzione per assicurarsi che venga risolta correttamente. Terminando correttamente le funzioni, puoi evitare addebiti eccessivi per le funzioni che vengono eseguite troppo a lungo o che entrano in un loop infinito. Inoltre, puoi assicurarti che l'istanza Cloud Functions che esegue la funzione non venga arrestata prima che la funzione raggiunga correttamente la condizione o lo stato di terminazione.
Utilizza questi approcci consigliati per gestire il ciclo di vita delle tue funzioni:
- Risolvi le funzioni che eseguono l'elaborazione asincrona (note anche come "funzioni in background") restituendo una promessa JavaScript.
- Termina le funzioni HTTP con
res.redirect()
,res.send()
ores.end()
. - Termina una funzione sincrona con un'istruzione
return;
.
Semplificare il codice asincrono con le promesse JavaScript
Le promesse sono un'alternativa moderna ai callback per il codice asincrono. Una promessa rappresenta un'operazione e il valore futuro che potrebbe restituire. Consente inoltre di propagare gli errori in modo simile a try/catch nel codice sincrono. Puoi leggere informazioni sulle promesse nell'SDK Firebase nel blog di Firebase e sulle promesse in generale su MDN.
Come funzionano le promesse con le funzioni
Quando restituisci una promessa JavaScript a una funzione, questa continua a essere eseguita finché la promessa non viene risolta o rifiutata. Per indicare che una funzione ha completato il suo lavoro correttamente, la promessa deve essere risolta. Per indicare un errore, la promessa deve essere rifiutata. Ciò significa che devi gestire solo gli errori che vuoi.
Il seguente codice prende un Firebase Realtime Database ref
e imposta il suo valore su
"world!"
. Restituendo il risultato di set
, la funzione è garantita per
continuare a essere eseguita finché l'operazione asincrona di scrittura della stringa nel database
non è completamente completata:
// Always change the value of "/hello" to "world!"
exports.hello = functions.database.ref('/hello').onWrite(event => {
// set() returns a promise. We keep the function alive by returning it.
return event.data.ref.set('world!').then(() => {
console.log('Write succeeded!');
});
});
Esempi nel contesto
La maggior parte dei nostri Cloud Functions esempi di codice include esempi di terminazione corretta della funzione. Ecco alcuni esempi che illustrano casi tipici:
- Trigger Realtime Database: una funzione HTTP seguita da un reindirizzamento
- Trigger Cloud Storage:
Un download di archiviazione seguito da
then
- Webhook on Realtime Database
write:
An error thrown inside a
then
clause - Eliminare periodicamente gli account inutilizzati: Una promessa rifiutata