È importante gestire il ciclo di vita di una funzione per assicurarsi che venga risolta correttamente. Se termini le funzioni correttamente, puoi evitare addebiti eccessivi da funzioni che vengono eseguite per troppo tempo o in loop infinito. Inoltre, puoi assicurarti che l'istanza Cloud Functions che esegue la funzione non si arresti 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 (chiamate anche "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. Ti consente inoltre di propagare errori simili 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, la funzione continua a funzionare finché la promessa non viene risolta o rifiutata. Per indicare che una funzione ha completato il proprio 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 codice seguente prende un Firebase Realtime Database ref
e imposta il relativo valore su
"world!"
. Se restituisci il risultato di set
, la funzione continuerà a funzionare fino al completamento dell'operazione asincrona di scrittura della stringa nel database:
// 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 in contesto
La maggior parte dei nostri Cloud Functions codici esempi include esempi di terminazione corretta delle funzioni. Ecco alcuni esempi di casi tipici:
- Trigger di Realtime Database: una funzione HTTP seguita da un reindirizzamento
- Attivazione Cloud Storage:
un download di spazio di archiviazione seguito da
then
- Webhook su scrittura
in Realtime Database:
viene generato un errore all'interno di una clausola
then
- Eliminare periodicamente gli account non utilizzati: una promessa rifiutata