È importante gestire il ciclo di vita di una funzione per assicurarti che venga risolta correttamente. Terminando correttamente le funzioni, puoi evitare addebiti eccessivi per funzioni che vengono eseguite per troppo tempo 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;.
Semplifica il codice asincrono con le promise JavaScript
Le promise sono un'alternativa moderna ai callback per il codice asincrono. Una promise rappresenta un'operazione e il valore futuro che potrebbe restituire. Inoltre, consente di propagare errori simili a try/catch nel codice sincrono. Puoi leggere informazioni sulle promise nell'SDK Firebase nel blog di Firebase e sulle promise in generale su MDN.
Come funzionano le promise 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 correttamente il suo lavoro, la promise 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 ref Firebase Realtime Database e ne imposta il valore su
"world!". Restituendo il risultato di set, la funzione continuerà a essere eseguita fino al completamento del lavoro asincrono 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 nel contesto
La maggior parte dei nostri esempi di codice Cloud Functions include esempi di terminazione corretta delle funzioni. Ecco alcuni esempi che illustrano i casi tipici:
- Trigger di Realtime Database: una funzione HTTP seguita da un reindirizzamento
- Trigger di Cloud Storage: un download dallo spazio di archiviazione seguito da
then - Webhook sulla scrittura di Realtime Database:
un errore generato all'interno di una clausola
then - Elimina periodicamente gli account inutilizzati: una promessa rifiutata